7

編集: 問題が解決されたため、以下のコードが機能するように変更されました。

具体的に(*hardwareList.next_item)->nextは、元々は角かっこなしで(たとえば*hardwareList.next_item->next)で書かれていて、コンパイラはそれを理解していませんでした。

コンパイラが私のCコードと混同される理由を解明しようとしています。簡単に追加できるように、すべてのアイテムと、最後の「次の」変数のアドレスへのポインタを格納するリンクリストを作成しようとしています。

typedef struct {
  int recordNum;
  char toolName[25];
  int quantity;
  float cost;
} HardwareData;

typedef struct _HardwareListItem{
  HardwareData data;
  struct _HardwareListItem* next;
} HardwareListItem;

typedef struct _HardwareList {
  HardwareListItem* items;
  HardwareListItem** next_item;
} HardwareList;

HardwareList readFromFile(FILE* fp)
{
  char stopReading = 0;
  HardwareList hardwareList = {0};
  hardwareList.next_item = &hardwareList.items;
  do {
    *hardwareList.next_item = (HardwareListItem*)calloc(1, sizeof(HardwareData));
    if (*hardwareList.next_item == NULL)
    {
      fprintf(stderr, "OOM Reading File\n");
      fflush(stderr);
      exit(EXIT_FAILURE);
    }
    if (fread(&((*hardwareList.next_item)->data), sizeof(HardwareData), 1, fp) != 1) {
      free(*hardwareList.next_item);
      *hardwareList.next_item = NULL;
      stopReading = 1;
    } else {
      hardwareList.next_item = &((*hardwareList.next_item)->next);
    }
  } while(!stopReading);

  return hardwareList;
}

コンパイラは言う:

line 31: error: request for member 'data' in something not a structure or union
line 36: error: request for member 'next' in something not a structure or union
4

2 に答える 2

8

私の推測では、問題は次のコードです。*(hardwareList.next_item)->data

next_itemはポインターへのポインターなので、コンパイラーはこれを読み取ります*((hardwareList.next_item)->data)が、もちろん機能しません。ポインターにはCのメンバーがありません。

((*(hardwareList.next_item))->data)正しい逆参照順序を取得してみてください。

于 2011-09-12T07:35:24.220 に答える
4

hardwareList.next_itemであるHardwareListItem**ため、その上の演算子は、明らかに構造体ではないを->返します。HardwareListItem*

使用しているポインタが多すぎるため、混乱を招きます。コードを単純化してみてください。そこにはたくさんのバグがあります。

于 2011-09-12T07:33:10.857 に答える