【问题标题】:"Dereferencing pointer to incomplete type", typedefs are ok“取消引用指向不完整类型的指针”,typedef 可以
【发布时间】:2017-02-25 06:21:36
【问题描述】:

我正在尝试实现一个哈希表。我收到上述错误,但我已经正确声明了我所有的结构/类型定义。 (我还在学习C,对不起) 错误发生在我的 while 循环中的 test.c 中,我在其中放置了 //ERROR。怎么了?

test.c

#include "mentry.h"
#include "mlist.h"

int main() {
  FILE *fPtr = fopen("S.txt", "r");
  MList *ml = ml_create();

  MEntry *m2;
  int i = 1;
  while ((m2 = me_get(fPtr)) != NULL) {
    unsigned long int hash = me_hash(m2, ml->numbuckets); // ERROR HERE
    i++;
  }

  return 0;
}

mlist.c

#include "mentry.h"
#include "mlist.h"

#define NUMBUCKETS 3
#define BUCKETSIZE 5

typedef struct bucket {
  int size; // number of elements in this bucket
  MEntry *entries; // array of MEntries
} Bucket;

typedef struct mlist {
  int numbuckets; // number of buckets
  Bucket **buckets; // an array of Bucket pointers
} MList;

/* ml_create  - creates a new mailing list
              - returns pointer to start of mailing list*/
MList *ml_create(void) {
  MList *ml = malloc(sizeof(MList));

  ml->numbuckets = NUMBUCKETS; // random initial number
                               // will increment once a bucket is full

  // init Buckets
  int b;
  for (b=0; b<ml->numbuckets; b++) {
    Bucket *bk = malloc(sizeof(Bucket));
    bk->size = 0;
    bk->entries = calloc(BUCKETSIZE, sizeof(MEntry));
    ml->buckets[b] = bk;
  }

  return ml;
}

mlist.h

#ifndef _MLIST_H_
#define _MLIST_H_

#include "mentry.h"

typedef struct mlist MList;

/* ml_create  - creates a new mailing list
              - returns pointer to start of mailing list*/
MList *ml_create(void);

#endif /* _MLIST_H_ */

【问题讨论】:

  • test.c 中没有可见的numbuckets 定义。您需要将结构定义从 mlist.c 移动到标题中

标签: c struct types dereference


【解决方案1】:

当您尝试在main 中访问ml-&gt;numbuckets 时,它所知道的关于m1 的类型是这样的:

typedef struct mlist MList;

它知道MList是一个结构类型,但它对其中的内容一无所知。

你需要把完整的定义放在mlist.h:

#ifndef _MLIST_H_
#define _MLIST_H_

#include "mentry.h"

typedef struct mlist {
  int numbuckets; // number of buckets
  Bucket **buckets; // an array of Bucket pointers
} MList;

/* ml_create  - creates a new mailing list
              - returns pointer to start of mailing list*/
MList *ml_create(void);

#endif /* _MLIST_H_ */

【讨论】:

    【解决方案2】:

    怎么了?

    只有当MList 的完整定义在该行可见时,您才能使用ml-&gt;numbuckets

    由于MList 的完整定义仅在mlist.c 中可见,因此您只能在该文件中访问struct 的成员。

    一种方法是在 mlist.h 中声明一个函数:

    unsigned long int me_hash_list(MEntry* m1, MList* m2);
    

    并在 mlist.c 中定义为:

    unsigned long int me_hash_list(MEntry* m1, MList* m2)
    {
       return me_hash(m1, m2->numbuckets);
    }
    

    然后从main 调用me_hash_list

    while ((m2 = me_get(fPtr)) != NULL) {
      unsigned long int hash = me_hash_list(m2, ml);
      i++;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-09-05
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多