Ошибка при попытке назначить несовместимые типы

Ошибка, которую я получаю, когда пытаюсь распечатать этот список, является ошибкой несовместимого типа. Я попытался использовать его как макрос структуры, макрос статической структуры, указатель, и ничего из этого не работает.

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. 
  }
}

Я не могу понять, что здесь делать. Любая помощь будет присвоена спасибо.


person Greg Brown    schedule 08.03.2012    source источник
comment
Пожалуйста, укажите сообщение об ошибке, которое вы получаете.   -  person Andrew Marshall    schedule 09.03.2012


Ответы (3)


p — это struct macro, а macro_list.next — это struct macro*. Изменить на:

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

Я сделал следующие дополнительные изменения:

  • от macro_list.next до p->next, иначе он никогда не прошел бы дальше второго элемента в списке.
  • изменил условие в while на p != NULL, иначе он не обработал бы последний элемент в списке, так как проверял p->next != NULL
person hmjd    schedule 08.03.2012

p имеет тип macro, но macro_list.next имеет тип macro *.

Вместо того, чтобы определять macro_list как struct macro (с пустым именем и телом), я бы определил его как struct macro *.

Также, когда вы проходите по списку, вы хотите, чтобы p = p->next; переходил к следующему элементу в списке. Как бы то ни было, вы всегда назначаете macro_list.next, так что вы будете неоднократно просматривать первый элемент в списке.

Чтобы пройти по такому связанному списку, я обычно использую:

struct macro *macro_list = NULL;

for (p=macro_list; p!= NULL; p=p->next) 
    printf("%s %s\n", p->macro_name, p->macro_body);
person Jerry Coffin    schedule 08.03.2012

Я полагаю, что next является указателем, поэтому:

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;
  }
}
person Ramy Al Zuhouri    schedule 08.03.2012