bonjour !
je suis en train de manipuler des listes et des piles. Voici les strucutres correspondante :
voici le code qui me donne du fil a retordre :
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 typedef struct { char* nomElt; //nom de l'élément TYPE typeElt; //nom du type de l'elt union { int val_INT; boolean val_BOOL; char val_CHAR; };//valeur de l'elt ; un de ces trois champs sera renseigne selon le type de l'elt struct stListSymbole * next; //chainage vers le suivant dans la liste } stListSymbole; //structure definissant la pile des tables des symboles //les operations "depiler" et "empiler" sont effectuees par les fonctions "creerTds" //et "supprimeTds" struct stPileTableSymbole { int nbTables; //le nombre de table dans la pile struct stEltPile *tableActive; //le sommet de la pile }; //structure definissant un element de la pile struct stEltPile { struct stEltPile* suivant;//la table suivante (en dessous) dans la pile stListSymbole *table;//l'element de la pile en lui meme repesente par sa tete de liste }; void initPileTable(); //initialise la pile de table des symboles lors de la toute //premiere utilisation struct stPileTableSymbole pileTable; //la pile en elle meme stListSymbole* ajoutSymbole (char * nom); //ajoute un symbole dans la table //active ; renvoie un pointeur sur la nouvelle tete de liste //ou NULL en cas d'echec. stListSymbole* existeSymbole (stListSymbole *liste, char * ident); //parcours la //table des symboles passee en parametre et //si un elt de nom "ident" s'y trouve deja renvoie un //pointeur decu, NULL sinon.
ce qui se passe c'est qu'au 1) et 2), j'ai (pileTable.tableActive)->table->nomElt qui est à null, ce qui est normal.
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 stListSymbole * ajoutSymbole(char * nom) { printf("1) dans ajout symb-> ancienne tête = %s\n",(pileTable.tableActive)->table->nomElt); stListSymbole * ptrNewElt; ptrNewElt = (stListSymbole *) malloc(sizeof(stListSymbole)); if(ptrNewElt == NULL) return NULL; memset(ptrNewElt,0,sizeof(stListSymbole)); printf("2) dans ajout symb-> ancienne tête = %s\n",(pileTable.tableActive)->table->nomElt); ptrNewElt->nomElt = strdup(nom); ptrNewElt->typeElt = INT; printf("3) dans ajout symb-> ancienne tête = %s\n",(pileTable.tableActive)->table->nomElt); ptrNewElt->next = (struct stListSymbole*)(pileTable.tableActive)->table;//on chaine le nouvel elt au reste de la liste (pileTable.tableActive)->table = ptrNewElt; //on met a jour la tete de liste sur le nouvel elt printf("dans ajout symb-> nouv tête = %s\n",(pileTable.tableActive)->table->nomElt); printf("dans ajour symbole ->précédent = %s\n",((stListSymbole*)ptrNewElt->next)->nomElt); return ptrNewElt; }
mais au 3), il devient égale à "nom" ! alors que je n'ai pas encore chainé ptrNewElt à (pileTable.tableActive)->table !
je ne comprend pas ce comportement, pouvez vous m'aider ?
Ardeciel
Partager