خطأ في التحويل:طلب العضوية في شيء ليس هيكلا أو اتحادا

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

  •  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*, ، والتي من الواضح أنها ليست بنية.

أنت تستخدم الكثير من المؤشرات، وهذا أمر محير.حاول تبسيط التعليمات البرمجية الخاصة بك، لديك الكثير من الأخطاء هناك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top