خطأ في التحويل:طلب العضوية في شيء ليس هيكلا أو اتحادا
-
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)
للحصول على ترتيب dereference الصحيح.
نصائح أخرى
hardwareList.next_item
يكون HardwareListItem**
, ، لذا المشغل ->
عليه يعود HardwareListItem*
, ، والتي من الواضح أنها ليست بنية.
أنت تستخدم الكثير من المؤشرات، وهذا أمر محير.حاول تبسيط التعليمات البرمجية الخاصة بك، لديك الكثير من الأخطاء هناك.