Kompilierungsfehler:antrag auf Mitgliedschaft in etwas, das keine Struktur oder Gewerkschaft ist
-
29-10-2019 - |
Frage
Bearbeiten: Der folgende Code wurde geändert, um zu funktionieren, da das Problem behoben wurde.
Speziell, (*hardwareList.next_item)->next
wurde ursprünglich ohne Klammern geschrieben (z.als *hardwareList.next_item->next
) und der Compiler hat es nicht verstanden.
Ich versuche herauszufinden, warum der Compiler mit meinem C-Code verwechselt wird.Ich versuche, eine verknüpfte Liste zu erstellen, in der alle Elemente und auch ein Zeiger auf die Adresse der letzten "nächsten" Variablen zum einfachen Anhängen gespeichert sind.
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;
}
Compiler sagt:
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
Lösung
Ich vermute, das Problem ist dieser Code: *(hardwareList.next_item)->data
next_item
ist ein Zeiger auf einen Zeiger, also vermute ich, dass der Compiler dies als liest *((hardwareList.next_item)->data)
was natürlich nicht funktioniert - Zeiger haben keine Mitglieder in C.
Versuchen ((*(hardwareList.next_item))->data)
um die richtige Dereferenzierungsreihenfolge zu erhalten.
Andere Tipps
hardwareList.next_item
ist HardwareListItem**
, daher gibt der Operator ->
darauf HardwareListItem*
zurück, der offensichtlich keine Struktur ist.
Sie verwenden zu viele Zeiger, das ist verwirrend.Versuchen Sie, Ihren Code zu vereinfachen. Dort gibt es unzählige Fehler.