Erro de compilação: pedido de membro em algo não uma estrutura ou união
-
29-10-2019 - |
Pergunta
Editar: o código abaixo foi modificado para funcionar conforme o problema foi resolvido.
Especificamente, (*hardwareList.next_item)->next
foi originalmente escrito sem colchetes (por exemplo, como *hardwareList.next_item->next
) e o compilador não o entendeu.
Estou tentando descobrir por que o compilador está se confundindo com meu código C.Estou tentando criar uma lista vinculada que armazena todos os itens e também um ponteiro para o endereço da última variável "próxima", para facilitar o acréscimo.
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;
}
O compilador diz:
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
Solução
Acho que o problema é este código: *(hardwareList.next_item)->data
next_item
é um ponteiro para um ponteiro, então meu palpite é que o compilador lê isso como *((hardwareList.next_item)->data)
, o que obviamente não funciona - ponteiros não têm membros em C.
Tente ((*(hardwareList.next_item))->data)
para obter a ordem de desreferência correta.
Outras dicas
hardwareList.next_item
é HardwareListItem**
, portanto, o operador ->
de ele retorna a GeneralDetagCode, que obviamente não é uma estrutura.
Você está usando muitos ponteiros, é confuso.Tente simplificar seu código, você tem toneladas de bugs lá.