2012-03-08 2 views
1

L'erreur que j'obtiens lorsque j'essaie d'imprimer cette liste est une erreur de type incompatible. J'ai essayé de le lancer comme une macro de structure, une macro de structure statique, un pointeur, et rien de tout cela ne marche.Erreur lors de la tentative d'affectation de types incompatibles

struct macro { 
    struct macro *next; 
    char * macro_name; 
    char * macro_body; 
}; 

static struct macro macro_list = { 
    .next = NULL, 
    .macro_name = NULL, 
    .macro_body = NULL 
}; 

//-------------------------------------------------------------------------------- 

void macro_list_print(void){ 
    printf("Printing macro_list\n"); 
    if(macro_list.next == NULL){ 
    printf("--No macros\n"); 
    } 
    struct macro p = macro_list; 
    while(p.next != NULL){ 
    printf("%s %s\n",p.macro_name,p.macro_body); 
    p = macro_list.next; //This line gives me the error. 
    } 
} 

Je n'arrive pas à comprendre quoi faire ici. Toute aide serait appropriée merci.

+0

S'il vous plaît inclure l'erreur que vous recevez. –

Répondre

1

p est un struct macro tandis que macro_list.next est un struct macro*. Changer à:

struct macro* p = &macro_list; 
while(p != NULL){ 
    printf("%s %s\n",p->macro_name,p->macro_body); 
    p = p->next; 
} 

J'ai fait les modifications suivantes:

  • macro_list.next à p->next, sinon il aurait jamais eu passé le deuxième élément de la liste.
  • changé la condition dans le while à p != NULL, sinon il ne serait pas traité le dernier élément de la liste qu'il vérifiait p->next != NULL
+0

Cela a fonctionné merci. –

0

p est de type macro, mais macro_list.next est de type macro *. Au lieu de définir macro_list comme struct macro (avec un nom et un corps vides), je le définirais comme struct macro * au lieu de définir macro_list comme struct macro.

De même, lorsque vous parcourez la liste, vous voulez p = p->next; pour accéder à l'élément suivant dans la liste. Comme c'est le cas, vous attribuez toujours macro_list.next, de sorte que vous regarderez à plusieurs reprises le premier élément de la liste.

Pour marcher une liste chaînée comme ça, je l'utilise normalement:

struct macro *macro_list = NULL; 

for (p=macro_list; p!= NULL; p=p->next) 
    printf("%s %s\n", p->macro_name, p->macro_body); 
0

Je suppose que la prochaine est un pointeur, donc:

void macro_list_print(void){ 
    printf("Printing macro_list\n"); 
    if(macro_list.next == NULL){ 
    printf("--No macros\n"); 
    } 
    struct macro* p = &macro_list; 
    while(p->next != NULL){ 
    printf("%s %s\n",p->macro_name,p->macro_body); 
    p = macro_list.next; 
    } 
} 
Questions connexes