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 :

initialiser les membres d'une structure


Sujet :

C

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 268
    Points : 139
    Points
    139
    Par défaut initialiser les membres d'une structure
    bonsoir , j'ai plusieurs structures

    /type def
    typedef struct expression * expression;
    typedef struct test * test;
    typedef struct symbole * symbole;
    typedef struct sequence * sequence;
    typedef struct mot_clef * mot_clef;





    //structure test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct test {
    expression elem1;
    char op[2] ;
    expression elem2;
    } Test ;
    //structure table des symboles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct symbole
    {
       char *nom_var;
       char *val_ch;
       float val_num;
       int type;
       symbole  lien;
    }Symbole;

    //structure sequence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct sequence{
    mot_clef instruction;
    sequence suivant;
    }Sequence;
    //structure instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    typedef struct mot_clef{
    char *nom;
    test condition ;
    char *nom_var;
    expression exp1;
    expression exp2;
    expression exp3;
    sequence seq1;
    sequence seq2;
    }Mot_clef;

    //structure expression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct expression {
    char * gauche;
    char * op; //(entier : 0 non défini, 1 caractère, 2 nombre, 3 phrase 4 calcul 5 nombre variable  6 chaine variable 7 variable variable   8 variable)
    int type;
    char * droite; } Expression;
    les unes liées aux autres comme vous pouvez le voir.


    Je définis une expression

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    E  = malloc(sizeof(expression));
    E->gauche = "i";
    E->droite = "j";
    E->type = 8;
    E->op = NULL;
    et je déclare un mot_clef qui a pour membre l'expression juste défini ci dessous


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    J = malloc(sizeof(mot_clef));
    J->nom = "PRINT";
     
    J->exp1 = E;
    J->exp2 = NULL;
    J->exp3 = NULL;
    J->seq1 = NULL;
    J->seq2 = NULL;
    J->condition = NULL;
    J->nom_var = NULL;
    le problème est quand j'affiche J->exp1->type il m'affiche 0 au lieu de 8

    Avec ddd , deja dès le malloc mes membres ont une adresse hors d'atteinte mais ils en one une et après certaines affectations les adresses de certains membres changent vraiment trop bizzare , auriez vous une explicatio?

    merci

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut Re: initialiser les membres d'une structure
    Lire la FAQ et/ou un bouquin sur le C et la gestion de la mémoire

    Il faudrait réviser les pointeurs et les structures...

    Citation Envoyé par molesqualeux
    bonsoir , j'ai plusieurs structures

    /type def
    typedef struct expression * expression;
    typedef struct test * test;
    typedef struct symbole * symbole;
    typedef struct sequence * sequence;
    typedef struct mot_clef * mot_clef;
    Mauvaise idée de masquer les pointeurs, cela provoque l'erreur que tu as plus bas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    E  = malloc(sizeof(expression));
    E->gauche = "i";
    E->droite = "j";
    E->type = 8;
    E->op = NULL;
    Plusieurs remarques:
    - gauche/droite sont des pointeurs, as-tu alloué de la place pour? Cela te semble une bonne idée? (Cela peut marcher si tu ne modifies jamais gauche et droite...)

    - Le test sur le malloc pour voir si la fonction a fonctionné?

    Une meilleure solution serait de faire ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    E  = malloc(sizeof(*E));
    if(E==NULL)
      {
      printf("Erreur d'allocation\n");
      exit(1);
      }
    Par contre, pour ce bout de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    J = malloc(sizeof(mot_clef));
    J->nom = "PRINT";
     
    J->exp1 = E;
    J->exp2 = NULL;
    J->exp3 = NULL;
    J->seq1 = NULL;
    J->seq2 = NULL;
    J->condition = NULL;
    J->nom_var = NULL;
    Mêmes remarques...

    le problème est quand j'affiche J->exp1->type il m'affiche 0 au lieu de 8
    Logique, vu que le malloc n'a pas fonctionner, comportement indéfini...

  3. #3
    Débutant
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 268
    Points : 139
    Points
    139
    Par défaut Re: initialiser les membres d'une structure
    Citation Envoyé par fearyourself
    Plusieurs remarques:
    - gauche/droite sont des pointeurs, as-tu alloué de la place pour? Cela te semble une bonne idée? (Cela peut marcher si tu ne modifies jamais gauche et droite...)
    doit on allouer de la mémoire pour des pointeurs sur chaine de caractères.?

  4. #4
    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 Re: initialiser les membres d'une structure
    Citation Envoyé par molesqualeux
    doit on allouer de la mémoire pour des pointeurs sur chaine de caractères.?
    Mmm... Raccourci sémantique confusant...

    En fait, le pointeur (ici, pointeur sur char) ne fait que stocker une adresse (si on lui donne). Cette adresse peut être celle d'un char, d'un tableau de char statique, d'un tableau de char dynamique, d'une chaine de caractères...

    Un pointeur tout seul non initialisé, ne va pas créer de la mémoire par magie. Il faut lui donner l'adresse d'un bloc mémoire valide.
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Débutant
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 268
    Points : 139
    Points
    139
    Par défaut
    char *s;

    s = malloc(sizeof(s[50])) ?

  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 molesqualeux
    char *s;

    s = malloc(sizeof(s[50])) ?
    Il ne faut pas inventer des syntaxes au hasard.
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *s = malloc (50 * sizeof *s);
    http://emmanuel-delahaye.developpez....tes.htm#malloc
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Débutant
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 268
    Points : 139
    Points
    139
    Par défaut Re: initialiser les membres d'une structure
    Citation Envoyé par fearyourself
    Lire la FAQ et/ou un bouquin sur le C et la gestion de la mémoire

    Il faudrait réviser les pointeurs et les structures...

    Citation Envoyé par molesqualeux
    bonsoir , j'ai plusieurs structures

    /type def
    typedef struct expression * expression;
    typedef struct test * test;
    typedef struct symbole * symbole;
    typedef struct sequence * sequence;
    typedef struct mot_clef * mot_clef;
    Mauvaise idée de masquer les pointeurs, cela provoque l'erreur que tu as plus bas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    E  = malloc(sizeof(expression));
    E->gauche = "i";
    E->droite = "j";
    E->type = 8;
    E->op = NULL;
    Plusieurs remarques:
    - gauche/droite sont des pointeurs, as-tu alloué de la place pour? Cela te semble une bonne idée? (Cela peut marcher si tu ne modifies jamais gauche et droite...)

    - Le test sur le malloc pour voir si la fonction a fonctionné?
    Le probleme c'est que j'ouvre plusieurs blocs expressions et quand j'alloue de la mémoire à la 2° expression il me change la 1°

  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 Re: initialiser les membres d'une structure
    Citation Envoyé par molesqualeux
    Le probleme c'est que j'ouvre plusieurs blocs expressions et quand j'alloue de la mémoire à la 2° expression il me change la 1°
    Je crois que tu veux faire des choses trop compliquées pour toi. Il n'y a pas de miracle. Il faut apprendre et maitriser les concepts un par un. Tu sais à peine ce qu'est une chaine de caractères et tu te lances dans les arbres ? Il faut arréter le délire, se poser, apprendre, expérimenter, consolilder et avancer pas à pas.

    Le C, c'est pas un jouet. C'est pas non plus un langage de bricoleur.
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //type def
    typedef struct expression * expression;
    typedef struct test * test;
    typedef struct symbole * symbole;
    typedef struct sequence * sequence;
    typedef struct mot_clef * mot_clef;


    Emmanuel et fearyourself te l'ont sans doute déjà dit, mais ta priorité absolue est de virer cela: Tu as pratiquement réussi à faire le pire, félicitations. Tu y est arrivé du premier coup?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    expression foo(expression exp1, struct expression exp2)

    Le Minimum, c'est:
    1) De ne pas donner à un typedef le même nom qu'à la structure (SURTOUT quand ça ne représente pas exactement la structure: ici, ça représente un pointeur).
    2) De ne pas masquer les pointeurs dans les typedefs. Par exemple, avec des noms qui les reflètent bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //typedefs
    typedef struct expression * pExpression;
    typedef struct test * pTest;
    typedef struct symbole * pSymbole;
    typedef struct sequence * pSequence;
    typedef struct mot_clef * pMotClef;
    typedef const struct expression * pcExpression;
    typedef const struct test * pcTest;
    typedef const struct symbole * pcSymbole;
    typedef const struct sequence * pcSequence;
    typedef const struct mot_clef * pcMotClef;
    (Oui, les pointeurs const, c'est une bonne idée de les utiliser aussi).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. comment voir et modifier les membres d'une structure ?
    Par dva2tlse dans le forum Débuter
    Réponses: 12
    Dernier message: 22/11/2008, 14h07
  2. Tri à bulle sur les membres d'une structure
    Par Jérôme.O[76] dans le forum C++
    Réponses: 3
    Dernier message: 02/10/2008, 14h29
  3. Problème avec les membres d'une structure
    Par doderic dans le forum C
    Réponses: 19
    Dernier message: 12/08/2008, 20h27
  4. Récupérer les élements d'une structure ...
    Par Franck.H dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 17/10/2005, 15h48
  5. [VB.NET]Reflexion lister les membres d'une classe ...presque
    Par lucie.houel dans le forum ASP.NET
    Réponses: 19
    Dernier message: 20/09/2005, 13h49

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