Ошибка при попытке назначить несовместимые типы - PullRequest
1 голос
/ 09 марта 2012

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

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

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

Ответы [ 3 ]

1 голос
/ 09 марта 2012

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
0 голосов
/ 09 марта 2012

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

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;
  }
}
0 голосов
/ 09 марта 2012

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

Вместо определения macro_list как struct macro (с пустым именем и телом) я бы определил его какa 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);
...