Kompilierungsfehler:antrag auf Mitgliedschaft in etwas, das keine Struktur oder Gewerkschaft ist

StackOverflow https://stackoverflow.com/questions/7384581

  •  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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top