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:
1 2 3 4 5 6
|
typedef struct test {
expression elem1;
char op[2] ;
expression elem2;
} Test ; |
//structure table des symboles
Code:
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:
1 2 3 4 5
|
typedef struct sequence{
mot_clef instruction;
sequence suivant;
}Sequence; |
//structure instruction
Code:
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:
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:
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:
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
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:
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:
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:
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...
Citation:
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...
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.?
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.
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:
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°
:oops: :oops:
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°
:oops: :oops:
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.