comportement d'affectation bizarre
bonjour !
je suis en train de manipuler des listes et des piles. Voici les strucutres correspondante :
Code:
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. |
voici le code qui me donne du fil a retordre :
Code:
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;
} |
ce qui se passe c'est qu'au 1) et 2), j'ai (pileTable.tableActive)->table->nomElt qui est à null, ce qui est normal.
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