gpt4 book ai didi

c - 错误: variable (struct) has initializer but incomplete type (C)

转载 作者:行者123 更新时间:2023-11-30 19:11:10 30 4
gpt4 key购买 nike

好吧,我对 C 非常陌生,需要解释为什么我会收到此错误:

“变量‘newFilm’具有初始值设定项,但类型不完整”

任务是创建一个名为 film 的结构。然后将 .txt 文件中的数据传递到该结构中,并创建表示 .txt 中所有数据的结构链接列表

问题似乎是编译器缺少我为 struct newFilm 分配内存的点,我相信这是正确完成的

主文件中的代码:

char* t = (char*)malloc(sizeof(char*));
int y;
char* r = (char*)malloc(sizeof(char*));
char* g = (char*)malloc(sizeof(char*));
int rt;
double s;

List* list = newList();

//read pReadFile
char input[256];
//read characters from file being pointed at, and store into input
while( fgets( input, 256, pReadFile )) {
//scan each line with each variable separated by a comma
fscanf(pReadFile,"%s %d %s %s %d %d\n", t,y,r,g,rt,s);
struct Film newFilm = createFilm(t,y,r,g,rt,s); //ERROR OCCURS HERE
addToList(list, newFilm);
}

printList(list, pWriteFile);

这是 film.c 源文件中的 createFilm 函数:

Film *createFilm(char *title, int year, char *rating,  
char *genre, int runtime, double score){

Film *newFilm = (Film*)malloc(sizeof(Film));
// n.b. error checking to be added - to be added

title = (char*)malloc(sizeof(title));
newFilm->title = title;


newFilm->year = year;

rating = (char*)malloc(sizeof(rating));
newFilm->rating = rating;

genre = (char*)malloc(sizeof(genre));
newFilm->genre = genre;


newFilm->runtime = runtime;


newFilm->score = score;



return newFilm;
}

虽然我认为 addToList 函数没有任何问题,但我认为我应该保留它,以便您有更好的上下文(在database.h 文件中):

void addToList(List* list, struct Film* film){

Node *node = (Node*)malloc(sizeof(Node));

//Generates an error message and the program terminates if
//insufficient memory is available.
if (node == NULL){

fprintf(stderr, "Error: Unable to allocate memory in list_add()\n");

exit(EXIT_FAILURE);
}

//appends film to tail of linked list
node->film = film;
node->next = NULL;

if (list->last == NULL){
list->first = list->last = node;
}
else{
list->last = list->last->next = node;
}
}

提前致谢:)

最佳答案

您缺少结构的声明。与struct Film;您可以创建任意多个struct Film *指针,因为编译器可以计算出指向电影的指针必须有多大(大到足以指向结构)。

但是,由于您所拥有的只是 Film 是一个结构(而不​​是结构是什么,或者它有多大),因此您实际上无法创建 struct Film变量,因为编译器无法知道要为其分配多少空间。有两个解决办法:

  1. 使整个结构可见。

这可能涉及将结构定义(不仅仅是声明)移动到头文件中。浏览器:

// old film.h
struct Film;

// new film.h
struct Film {
int with;
int all;
int of;
int the;
int things;
int it;
int needs;
};
  • 使整个结构不透明,并使用不透明访问。
  • 这意味着您从未真正创建 struct Film使用它的代码中的任何位置。相反,您可以编写函数来创建/销毁电影指针并访问/修改每个元素。

    通常,选项 2 更具可扩展性(因为更改结构不会影响代码),但选项 1 更容易。

    关于c - 错误: variable (struct) has initializer but incomplete type (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40597730/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com