IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème avec les membres d'une structure


Sujet :

C

  1. #1
    Membre habitué Avatar de doderic
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 215
    Points : 165
    Points
    165
    Par défaut Problème avec les membres d'une structure
    SAlut à tous,
    J'ai un problème bizarre que je n'ai jamais eu et que j'aimerais comprendre. J'écris un programme en C(avec GTK), un programme censé être big mais je ne suis qu'au début. J'ai une structure qui contient tous les variables dont j'ai besoin l'interface graphique principale. Ainsi dans le main je déclare un pointerur sur cette strucure que j'alloue et avec lequel j'accède aux membres de la structure. jusque là tout va bien. Mon problème est le suivant. Au fur et à mesure que j'utilise les variables (de la structure), les autres ne marchent plus. je veux dire par là qu'après un certain nombre qui ont marché, il ya d'autres que j'utilise et qui ne marche plus. La compilation se fait sans problème mais le programme ne s'exécute pas. ça ne se lance même pas.

    Pour essayer de résoudre, j'ai redéclaré les autres variables (donc inutilisables) en local et là ça marche. Pourquoi celà, c'est dû à quoi? J'espère que je me suis fait comprendre. Si quelqu'un sait ce que c'est merci de me le dire

    Bonne suite à tous!

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 48
    Points : 37
    Points
    37
    Par défaut
    Bonjour,

    Peut etre pourront nous avoir un peu de code ?

    Parce que la c'est tres difficile de cerner le probleme

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par doderic Voir le message
    Pour essayer de résoudre, j'ai redéclaré les autres variables (donc inutilisables) en local et là ça marche. Pourquoi celà, c'est dû à quoi? J'espère que je me suis fait comprendre.
    Pas vraiment... Ce que tu as écrit n'a pas beaucoup de sens... On dirait qu'il y a un débordement de mémoire ou que tu utilises une zone mémoire trop petite... Bref, poste ton code.
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Membre habitué Avatar de doderic
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 215
    Points : 165
    Points
    165
    Par défaut
    Slt! En fait je ne voyais pas trop l'utilité de poster le code mais si ça peut servir alors le voici en dessous mais avant ça pour répondre à Emmanuel:
    Doderic a dit:
    Pour essayer de résoudre, j'ai redéclaré les autres variables (donc inutilisables) en local et là ça marche. Pourquoi celà, c'est dû à quoi? J'espère que je me suis fait comprendre.
    Emmanuel a répondu
    Pas vraiment... Ce que tu as écrit n'a pas beaucoup de sens... On dirait qu'il y a un débordement de mémoire ou que tu utilises une zone mémoire trop petite... Bref, poste ton code.
    Voilà ce que je veux dire par là: étant donné qu'en utilsant les autres membres de la structure le programme ne s'éxécute plus, il a fallu que je définne des variables en locale dans la fonction pour créer les widgets que je voulais et là le programme continue de s'éxécuter.

    Pour le code:
    - la structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    struct ihm{
           GtkWidget *menubar;
           GtkWidget *menu;
           GtkWidget *menuitem;
           GtkWidget *toolbar;
           GtkWidget *main_vbox;
           GtkWidget *main_window;
           GtkWidget *hbutton[2];
           GtkWidget *otr_hbutton;
           GtkWidget *but_hbutton[8];
           GtkWidget *combobox_but[2];
           GtkWidget *hpaned;
           GtkWidget *main_notebook;
           GtkWidget *scrolledwindow;
           GtkWidget *tree;
           GtkListStore *liststore;
           GtkTreeViewColumn *column;
           GtkTreeIter iter;
           GtkCellRenderer *render;
           GtkWidget *mainframe;
           GtkWidget *mframe_vbox;
     
    //GtkWidget *alignment;
    //GtkWidget *client_img;
    //GtkWidget *ajou_but;
    //GtkWidget *but_hbox;
     
            GtkWidget *rechbutton;
     
           GtkWidget *rechframe;
           GtkWidget *rechframe_entry;
     
           GtkWidget *stbar_label;
           GtkWidget *hseparator;
           GtkWidget *rechframe_vbox;
           GtkTreeSelection *selection;
           guint idContextId1=0;
           guint idContextId2=0;
     
    };
    une partie du code la fonction creer_contenu_milieu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    GtkWidget *but_img=gtk_image_new_from_stock("gtk-apply",GTK_ICON_SIZE_BUTTON);
         GtkWidget *but_hbox=gtk_hbox_new(FALSE,2);
         GtkWidget *alignment=gtk_alignment_new(0.5,0.5,0,0);;
         GtkWidget *ajout_but=gtk_button_new();
         gtk_box_pack_start(GTK_BOX(p->mframe_vbox),ajout_but,FALSE,FALSE,20);
         GtkWidget *but_label=gtk_label_new("Ajouter le Client");
     
         gtk_container_add(GTK_CONTAINER(ajout_but),alignment);
         gtk_container_add(GTK_CONTAINER(alignment),but_hbox);
         //...
    Dans le main

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct ihm *p=g_malloc(sizeof(struct ihm));
     
        gtk_init(&argc,&argv);
        //...    
        creer_menu(p);
        creer_barre_outils(p);
        creer_contenu_milieu(p); // La fonction ou le problème a commencé
     
        //...    
    g_free(p);
    En exemple regardez les variables que j'ai mis en commentaire, il a fallu que je redéfinisse d'autres variables (en local) dans la fonction pour faire ce qu'ils doivent faire. C'est pareil pour tous les autres variables que je n'ai pas encore utilisées. Je rappelle le problème. ça compile mais le programme ne s'éxécute pas. pourtant j'ai alloué la structure. Bien! j'espère que j'ai été plus clair sinon faites le moi savoir, je veux bien savoir à quoi c'est dû.

    Bonne suite

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    As-tu essayé de debugger en pas à pas ton code? Par ce qu'avec les bribes d'information que tu donnes, cela ressemble effectivement à un problème d'adressage.

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par doderic Voir le message
    Pour le code:
    Dans le code que tu as posté, on ne voit pas comment sont initialisés les champs de la structure.

    Nota : Il n'est pas utile de définir la structure de façon dynamique. Comme elle est d'une taille raisonnable, elle peut très bien être définie en automatique dans le main() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct ihm ihm = {0};
     
        gtk_init(&argc,&argv);
        //...    
        creer_menu(&ihm);
        creer_barre_outils(&ihm);
        creer_contenu_milieu(&ihm); // La fonction ou le problème a commencé
     
        //...
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre habitué Avatar de doderic
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 215
    Points : 165
    Points
    165
    Par défaut
    Hi tout le monde. Emmanuel j'ai essayé le code que t'as proposé et figure toit que ça donne le même résultat que le problème que j'ai et quand j'ai alloué de nouveau la structure comme je l'avais fait ça a marché mais mon blème à moi subsiste. En fait ça m'a fait pensé qu'il y a un problème d'insuffisance de mémoire. J'ai une question concernant ce que Emmanuel a dit. Quand d'après toi faut-il alors penser à allouer une structure si tu trouve que le mien n'a pas forcément besoin d'être alloué? J'espère ta réponse . Bonne suite!

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par doderic Voir le message
    Quand d'après toi faut-il alors penser à allouer une structure si tu trouve que le mien n'a pas forcément besoin d'être alloué
    Quand la structure dépasse une 'taille raisonnable'.

    La notion de 'taille raisonnable' pour une variable automatique dépend de l'architecture. Disons 10% de la taille max de la pile.

    Après il faut voir les caractéristiques de l'architecture. A la louche, la taille de la pile allouée par processus est :
    • DOS : 10 ko
    • Windows : 100 ko
    • NT/unixoïdes 1 Mo

    etc.
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    slt, je voi pas l'utilité d'utiliser des variables dynamique dans la structure.
    la notion pointeur dans le C n'est pas de tout facile donc je croi que c'est un problém d'adressage en + il faut l'exécution pas à pas pour localiser le problém (quelles variables ne fonctionne pas correctement?)

  10. #10
    Membre habitué Avatar de doderic
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 215
    Points : 165
    Points
    165
    Par défaut
    Slt! Justement je n'utilise pas de variable dynamique dans la structure. Ce ne sont que des pointeurs sur GtkWidget qu'il ya dedans. Et tu me dis d'exécuter pas à pas pour aboutir à quoi finalement? Quand à ta question "quelles variables ne fonctionne pas correctement?", je les connais mais j'en fais quoi? Ton approche de solution n'est pas clair du tout et ne dis rien de grand.

    Pour Emmanuel:
    Si je prends les infos que tu me donnes, comment je fais alors pour savoir la taille qu'une structure de mon genre contenant des Widget peut prendre en mémoire pour que je sache quand l'allouer? A+

  11. #11
    Membre habitué Avatar de doderic
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 215
    Points : 165
    Points
    165
    Par défaut
    Au fait j'ai dis que je pensais que ça doit être un problème d'insuffisance de mémoire. Et si c'était vrai comment ça se fait et le résoudre? ce n'est qu'un avis. Si vous avez autre chose à me proposer, je suis partant

  12. #12
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 945
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 945
    Points : 5 659
    Points
    5 659
    Par défaut
    Fao,
    Citation Envoyé par doderic Voir le message
    Au fait j'ai dis que je pensais que ça doit être un problème d'insuffisance de mémoire. Et si c'était vrai comment ça se fait et le résoudre? ce n'est qu'un avis. Si vous avez autre chose à me proposer, je suis partant
    J'en ai une : ne pas utiliser de variables globales.
    Si les cons volaient, il ferait nuit à midi.

  13. #13
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    A priori, c'est un banal écrasement des données de la structure.
    Vérifier les indices des buttons[] si on ne tape pas au-delà de la taille allouée.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  14. #14
    Membre habitué Avatar de doderic
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 215
    Points : 165
    Points
    165
    Par défaut
    A priori, c'est un banal écrasement des données de la structure.
    Vérifier les indices des buttons[] si on ne tape pas au-delà de la taille allouée
    Ouh la la décidément je n'ai pas toujours pas eu de réponse convaincant ou qui s'approche du blème . Pourquoi et comment vérifier les indices de boutons? ils ont un type GtkWidget genre GtkWidget *buttons[2] par exemple; alors chaque indice représente un bouton, là je ne pense pas qu'il peut avoir un cas de débordement de ce côté. Je vous invite à relire le problème depuis le début si vous voulez bien. c'est valable pour tous A+

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par doderic Voir le message
    (. Pourquoi et comment vérifier les indices de boutons? ils ont un type GtkWidget genre GtkWidget *buttons[2] par exemple; alors chaque indice représente un bouton, là je ne pense pas qu'il peut avoir un cas de débordement de ce côté.
    D'une manière générale, quand on manipule un tableau de taille N, on doit s'assurer que l'indice qui sert à accéder à ce tableau est compris dans les limites 0 .. N-1 incluses.
    Pas de Wi-Fi à la maison : CPL

  16. #16
    Membre habitué Avatar de doderic
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 215
    Points : 165
    Points
    165
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    D'une manière générale, quand on manipule un tableau de taille N, on doit s'assurer que l'indice qui sert à accéder à ce tableau est compris dans les limites 0 .. N-1 incluses.
    Eh bien Emmanuel j'ai tenu compte de ça! de ce côté je suis tranquille. il va falloir chercher ailleurs. En fait si seulement il existe un outil de profiler libre ou gratos sous windows de code genre valgrind ou purify chez les linuxois j'allais déjà m'en sortir mais... j'espère que la réponse viendra à force que chacun participe

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par doderic Voir le message
    j'espère que la réponse viendra à force que chacun participe
    Le jour où tu posteras un code compilable réduit au minimum qui montre le défaut, oui...
    Pas de Wi-Fi à la maison : CPL

  18. #18
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 39
    Points : 44
    Points
    44
    Par défaut
    doderic,
    il est difficile de deviner ce qui se trouve sans la partie non publiée de ton code, mais il me semble que le probleme, du moins dans le code que tu as publié se trouve dans cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     gtk_box_pack_start(GTK_BOX(p->mframe_vbox),ajout_but,FALSE,FALSE,20);
    tu mets ajout_but dans p->mrfamme_vbox.

    Or, une fois que ta fonction creer_contenu_milieu est terminée, ajout_but est perdu!

    Tu dois, à mon avis, repenser ton programme. Ta stucture ihm est bourrée de pointeurs, et tu sais qu'avec ce genre de bestioles (les pointeurs) il faut être très prudent.

  19. #19
    Membre habitué Avatar de doderic
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 215
    Points : 165
    Points
    165
    Par défaut
    Citation Envoyé par passager Voir le message
    doderic,
    il est difficile de deviner ce qui se trouve sans la partie non publiée de ton code, mais il me semble que le probleme, du moins dans le code que tu as publié se trouve dans cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     gtk_box_pack_start(GTK_BOX(p->mframe_vbox),ajout_but,FALSE,FALSE,20);
    tu mets ajout_but dans p->mrfamme_vbox.

    Or, une fois que ta fonction creer_contenu_milieu est terminée, ajout_but est perdu!

    Tu dois, à mon avis, repenser ton programme. Ta stucture ihm est bourrée de pointeurs, et tu sais qu'avec ce genre de bestioles (les pointeurs) il faut être très prudent.
    Slt! En fait, ce n'est pas en fait cette instruction qui pose problème. Je vais essayer d'être encore plus claire.
    Supposons une structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct{
    membre1;
    membre2;
    membre3;
    //...
    };
    et un pointeur p sur cette structure allouée dynamiquement.
    Le problème est que après un nombre déterminé de membre utilisé, tous les autres que j'utilise ne marchent pas et c'est ce qui fait que l'exe ne n'exécute pas après la compilation. Dans le cas de l'exemple donné ci-dessus c'était comme si après qu'on est utilisé membre1 et membre2, tout ceux qui restent en bas de membre2 sont la cause du problème, ce qui m'a poussé à déclarer d'autres variables en local pour faire ce boulot ou lieu d'utiliser ceux des structures. Voilà! Si c'est pas toujours clairs je suis là. A+

  20. #20
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par doderic Voir le message
    Voilà! Si c'est pas toujours clairs je suis là.
    Non ce n'est pas vraiment plus clair qu'avant.

    Qu'est ce que tu ne comprends pas dans :

    Citation Envoyé par Emmanuel Delahaye Voir le message
    Le jour où tu posteras un code compilable réduit au minimum qui montre le défaut, oui...
    Car a part te dire que tu as a priori un problème dans ton code, il est difficile d'être plus précis sans savoir ce que tu as fait exactement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA]Problème avec les critères d'une recherche de fichier
    Par lucho013 dans le forum VBA Access
    Réponses: 3
    Dernier message: 16/04/2007, 23h40
  2. [Système] Problème avec les méthodes d'une classe
    Par oussama127 dans le forum Langage
    Réponses: 7
    Dernier message: 30/08/2006, 09h18
  3. Problème avec les indexes sur une base de données.
    Par osoudee dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 09/02/2006, 09h24
  4. initialiser les membres d'une structure
    Par molesqualeux dans le forum C
    Réponses: 8
    Dernier message: 02/02/2006, 19h57
  5. [Débutant] Problème avec les paramètres d'une proc stockée
    Par babulior dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/06/2005, 15h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo