1

このリストを印刷しようとすると発生するエラーは、互換性のないタイプのエラーです。構造体マクロ、静的構造体マクロ、ポインターとしてキャストしようとしましたが、どれも機能しません。

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

ここで何をすべきかわからない。どんな助けでも感謝に割り当てられるでしょう。

4

3 に答える 3

1

pは でありstruct macromacro_list.nextstruct 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ないと、リストの 2 番目の項目を通過することはありません。
  • の条件を に変更しましたwhilep != NULLそうしないと、チェックしていたリストの最後の要素が処理されませんでしたp->next != NULL
于 2012-03-08T21:27:38.370 に答える
0

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);
于 2012-03-08T21:31:35.113 に答える
0

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;
  }
}
于 2012-03-08T21:31:52.970 に答える