好的,我是C语言的新手,需要解释为什么我收到此错误:
“变量'newFilm'具有初始化程序,但类型不完整”
任务是创建一个名为film的结构。然后将数据从.txt文件传递到该结构中,并创建一个表示该.txt中所有数据的结构链接列表。
问题似乎是编译器缺少我为结构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
变量,因为编译器无法知道为此分配多少空间。有两个修复程序:
这可能涉及将结构定义(不仅仅是声明)移动到头文件。 IE浏览器:
// 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更容易。