erreur de compilation: demande de membre dans quelque chose de pas une structure ou d'une union
Edit: Le code ci-dessous a été modifié pour qu'il fonctionne comme le problème a été résolu.
Plus précisément, (*hardwareList.next_item)->next
a été écrit à l'origine sans crochets (par exemple, comme *hardwareList.next_item->next
) et le compilateur ne la comprenait pas.
Je suis en train de faire de l'exercice pourquoi le compilateur est de se confondre avec mon code C. Je suis en train de créer une liste chaînée qui stocke tous les éléments et aussi un pointeur vers l'adresse de la dernière "suivant" variable, pour faciliter l'ajout.
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;
}
Compilateur dit:
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
Le compilateur ne veut pas donner les numéros de ligne? Mauvais compilateur...
(hardwareList.next_item)->suivant ne fonctionne pas comme next_item n'est pas un pointeur sur une struct
Oups, my bad. Je vais modifier en une seconde.
Compilateur ne donner les numéros de ligne mais ils n'auraient pas correspondent à ce que j'ai copié dans.. Édité maintenant, avec de nouveaux numéros de ligne.
Dans ce cas, ajoutez un commentaire à l'collé code comme celui qui contient le message d'erreur 🙂
(hardwareList.next_item)->suivant ne fonctionne pas comme next_item n'est pas un pointeur sur une struct
Oups, my bad. Je vais modifier en une seconde.
Compilateur ne donner les numéros de ligne mais ils n'auraient pas correspondent à ce que j'ai copié dans.. Édité maintenant, avec de nouveaux numéros de ligne.
Dans ce cas, ajoutez un commentaire à l'collé code comme celui qui contient le message d'erreur 🙂
OriginalL'auteur Adam M-W | 2011-09-12
Vous devez vous connecter pour publier un commentaire.
Je suppose que le problème est ce morceau de code:
*(hardwareList.next_item)->data
next_item
est un pointeur vers un pointeur, donc je suppose que le compilateur lit ce que*((hardwareList.next_item)->data)
qui bien sûr ne fonctionne pas - les pointeurs n'ont pas de membres de la C.Essayer
((*(hardwareList.next_item))->data)
pour obtenir le déréférencement de l'ordre.OriginalL'auteur Aaron Digulla
hardwareList.next_item
estHardwareListItem**
, de sorte que l'opérateur->
sur elle retourneHardwareListItem*
, qui, évidemment, n'est pas une struct.Vous utilisez trop de pointeurs, il est source de confusion. Essayez de simplifier votre code, vous avez des tonnes de bugs.
OriginalL'auteur littleadv