以下是使用的头文件:
typedef struct room room;
struct room {
char name[21];
int num_doughnuts;
int num_milkshakes;
room* portal[4];
};
和我的代码:
struct room* create_room()
{
for(i = 0; i < num_room; i++)
{
room[i] = (struct room*)malloc(sizeof(room));
printf("input room details\n");
fgets(input, max_length, stdin);
sscanf(input, "%s %i %i", room_name, &dnuts, &mshakes);
strcpy(room[i].name, room_name); //assign name
room[i].num_doughnuts = dnuts; //assign doughnuts
room[i].num_milkshakes = mshakes; //assign milkshakes
}
return 0;
}
在调用create_room()之前,我已经在main函数中声明了room结构
struct room room[num_room];
我应该获得用户输入来存储字符串和两个整数用于用户定义的房间数量。
对于这些行,我一直收到错误expected identifier or '('
:
room[i] = (struct room*)malloc(sizeof(room));
room[i].num_doughnuts = dnuts; //assign doughnuts
room[i].num_milkshakes = mshakes; //assign milkshakes
我也得到:意外类型'房间':尝试分配名称时的预期表达式:
strcpy(room[i].name, room_name); //assign name
我宣布它的方式有问题,但我不知道是什么。我已经看到了一些这些问题并尝试了几种不同类型的解决方案,但我一直遇到类似的错误。
有人可以对此有所了解吗?我真的被卡住了! 非常感谢!
P.S如果它帮助所有这些房间在创建之后必须存储在双向链表中,并且门户[4]存储指向其他房间的指针。我不知道这是否与我的问题有关,但额外的信息从来没有伤害任何人!
答案 0 :(得分:1)
你写的是在主函数中声明了数组room
。然后它在create_rooms
中不可见。这意味着只有room
可见,typedef
声明了类型,这就是编译器抱怨的原因。
请注意,您不能在 main之外声明数组room
,因为您已经使用全局标识room
作为typedef
声明的类型。 (为什么main
中的声明不会产生编译错误?如果在main中完成,则本地声明会隐藏全局声明,即room
中不可见main
类型。)
解决方案:在main
之外声明数组并以不同方式命名。
答案 1 :(得分:0)
我怀疑问题出在这一行:
typedef struct room room;
每次尝试引用结构时,它都会做有趣的事情。尝试删除它,因为你还没有使用它。
答案 2 :(得分:0)
您正在以混乱的方式重复使用“房间”这个名称
struct room room [num_room]; / * room&amp;房间又来了? * /
我很惊讶甚至编译,请使用不同的变量名称
另外,num_room是const还是#define?您正在定义一组房间,并在create_room中为每个房间做malloc。请检查一下
以快速而肮脏的方式,我让它工作,随时提示并询问我是否有具体问题(在评论中):
#include <stdio.h>
typedef struct room room;
struct room {
char name[21];
int num_doughnuts;
int num_milkshakes;
room* portal[4];
};
int num_room = 2;
struct room* create_rooms()
{
int i;
/* Create a pointer to rooms */
struct room *rooms;
char input[256], room_name[256];
int dnuts, mshakes;
int max_length = 256;
/* Allocate memory for all rooms */
rooms = malloc( num_room * sizeof(room) );
for(i = 0; i < num_room; i++)
{
printf("input room details\n");
fgets(input, max_length, stdin);
sscanf(input, "%s %i %i", room_name, &dnuts, &mshakes);
strcpy(rooms[i].name, room_name); //assign name
rooms[i].num_doughnuts = dnuts; //assign doughnuts
rooms[i].num_milkshakes = mshakes; //assign milkshakes
}
return rooms;
}
main()
{
struct room *rooms;
int j;
rooms = create_rooms();
for ( j=0; j < num_room; j++ )
{
printf( "%s, %d %d\n", rooms[j].name, rooms[j].num_doughnuts, rooms[j].num_milkshakes );
}
/* free */
free (rooms );
}