コンパイルエラー:構造体または共用体ではないもののメンバーのリクエスト
-
29-10-2019 - |
質問
編集: 問題が解決されたため、以下のコードが機能するように変更されました。
具体的には、 (*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
解決
問題はこのコード部分だと思います: *(hardwareList.next_item)->data
next_item
はポインタへのポインタなので、コンパイラはこれを次のように読み取ると思います *((hardwareList.next_item)->data)
もちろんこれは機能しません。C ではポインターにはメンバーがありません。
試す ((*(hardwareList.next_item))->data)
正しい間接参照順序を取得します。
他のヒント
hardwareList.next_item
は HardwareListItem**
, 、つまり演算子 ->
それが戻ってくる HardwareListItem*
, 、これは明らかに構造体ではありません。
ポインタを多用しすぎて混乱してしまいます。コードを単純化してみてください。そこには大量のバグがあります。
所属していません StackOverflow