将结构指针传递给函数
Passing struct pointers to functions
嘿,我无法理解结构如何作为指针传递给函数,因为我想稍后在我的项目中修改我的结构。所以我正在创建一个有房间的游戏,这个函数创建了一个二维数组的世界。我正在传递 struct room 和 struct World,因为我将每个房间存储在 World struct 中的绳索中,这是一个二维数组。当我打印出每个房间时,它没有打印出任何东西,我认为问题出在我的指示上。
所以我的第一个函数是在一个结构数组中,它将包含所有房间,并将每个房间初始化为数组。然后我尝试打印出每个房间号,但它没有打印任何东西。
第二个函数创建我的 2d 世界,它将成为 3x3 世界。将一个房间放到世界线
struct room
{
int roomNum;
int creaturesTotal;
char description[50];
char cleanOrdirty[20];
};
int main()
{
int MaxRooms = 8;
int rows = 2;
int cols = 2;
//creaste each room
struct room Room1;
struct room Room2;
struct room Room3;
struct room Room4;
struct room Room5;
struct room Room6;
struct room Room7;
struct room Room8;
struct room Room9;
struct PC player;
player.respect = 40;
//Store them into a array
struct room AllRooms[MaxRooms];
AllRooms[0] = Room1;
AllRooms[1] = Room2;
AllRooms[2] = Room3;
AllRooms[3] = Room4;
AllRooms[4] = Room5;
AllRooms[5] = Room6;
AllRooms[6] = Room7;
AllRooms[7] = Room8;
AllRooms[8] = Room9;
struct room World[rows][cols];
createRooms(AllRooms);
//create the world
createWorld(AllRooms,rows,cols,World);
struct PC cords[rows][cols];
player = startPointPC(&player,rows,cols,&World,&cords);
}
void createRooms(struct room* AllRooms[])
{
int MaxRooms = 8;
int number = 1;
for(int i = 0;i <= MaxRooms; i++)
{
AllRooms[i]->roomNum = number;
number++;
}
for(int i = 0;i <= MaxRooms; i++)
{
printf("%d",AllRooms[i]->roomNum);
}
}
//creates the 2d world
void createWorld(struct room* AllRooms[], int rows, int cols, struct room* World[rows][cols])
{
int counter = 0;
for(int i = 0; i <= rows;i++)
{
for(int j = 0; j <= cols; j++)
{
World[i][j] = AllRooms[counter];
counter++;
printf("\nWorld %d", World[i][j]->roomNum);
}
}
}
struct PC startPointPC(struct PC* player,int rows, int cols, struct room*
World[rows][cols],struct PC* cords[rows][cols])
{
int x = 0;
int y = 0;
player->x = x;
player->y = y;
//cords[x][y] = player;
printf("\nYou are starting in Room %d",World[x][y]->roomNum);
return player;
}
此声明
AllRooms[8] = Room9;
访问数组之外的内存,该数组的元素在 [0, MaxRooms).
范围内
此外这样的赋值例如这个
AllRooms[0] = Room1;
可以调用未定义的行为,因为对象 Room1 未初始化并且其整数数据成员可以具有陷阱值。
您创建了一个一维数组
struct room AllRooms[MaxRooms];
并将其作为参数传递给函数 createRooms
createRooms(AllRooms);
表达式中的数组指示符(极少数例外)被转换为指向其第一个元素的指针。
所以实际上这个调用
createRooms(AllRooms);
等同于
createRooms(&AllRooms[0]);
并且参数的类型为 struct room *
。
然而,您声明的函数具有结构 room* AllRooms[]
类型的参数,编译器将其调整为 struct room **
.
类型
编译器应发出一条错误消息,表明没有从一种类型的参数到另一种类型的函数参数的隐式转换。
此外,该函数应在其在 main 中使用之前声明。
也在这样的循环函数中
for(int i = 0;i <= MaxRooms; i++)
您使用的索引范围不正确。有效范围是 [0, MaxRooms)
所以函数至少应该按照下面的方式声明和定义
void createRooms( struct room AllRooms[] )
{
int MaxRooms = 8;
int number = 1;
for(int i = 0;i < MaxRooms; i++)
{
AllRooms[i].roomNum = number;
number++;
}
for(int i = 0;i < MaxRooms; i++)
{
printf("%d",AllRooms[i].roomNum);
}
}
使用函数
的局部变量 MaxRooms
也是个坏主意
int MaxRooms = 8;
而不是传递指定数组大小的相应参数。
函数 createWorld 也存在类似问题。
应该像
那样声明和定义
void createWorld( struct room AllRooms[], int rows, int cols, struct room World[rows][cols])
{
int counter = 0;
for(int i = 0; i < rows;i++)
{
for(int j = 0; j < cols; j++)
{
World[i][j] = AllRooms[counter];
counter++;
printf("\nWorld %d", World[i][j].roomNum);
}
}
}
嘿,我无法理解结构如何作为指针传递给函数,因为我想稍后在我的项目中修改我的结构。所以我正在创建一个有房间的游戏,这个函数创建了一个二维数组的世界。我正在传递 struct room 和 struct World,因为我将每个房间存储在 World struct 中的绳索中,这是一个二维数组。当我打印出每个房间时,它没有打印出任何东西,我认为问题出在我的指示上。
所以我的第一个函数是在一个结构数组中,它将包含所有房间,并将每个房间初始化为数组。然后我尝试打印出每个房间号,但它没有打印任何东西。
第二个函数创建我的 2d 世界,它将成为 3x3 世界。将一个房间放到世界线
struct room
{
int roomNum;
int creaturesTotal;
char description[50];
char cleanOrdirty[20];
};
int main()
{
int MaxRooms = 8;
int rows = 2;
int cols = 2;
//creaste each room
struct room Room1;
struct room Room2;
struct room Room3;
struct room Room4;
struct room Room5;
struct room Room6;
struct room Room7;
struct room Room8;
struct room Room9;
struct PC player;
player.respect = 40;
//Store them into a array
struct room AllRooms[MaxRooms];
AllRooms[0] = Room1;
AllRooms[1] = Room2;
AllRooms[2] = Room3;
AllRooms[3] = Room4;
AllRooms[4] = Room5;
AllRooms[5] = Room6;
AllRooms[6] = Room7;
AllRooms[7] = Room8;
AllRooms[8] = Room9;
struct room World[rows][cols];
createRooms(AllRooms);
//create the world
createWorld(AllRooms,rows,cols,World);
struct PC cords[rows][cols];
player = startPointPC(&player,rows,cols,&World,&cords);
}
void createRooms(struct room* AllRooms[])
{
int MaxRooms = 8;
int number = 1;
for(int i = 0;i <= MaxRooms; i++)
{
AllRooms[i]->roomNum = number;
number++;
}
for(int i = 0;i <= MaxRooms; i++)
{
printf("%d",AllRooms[i]->roomNum);
}
}
//creates the 2d world
void createWorld(struct room* AllRooms[], int rows, int cols, struct room* World[rows][cols])
{
int counter = 0;
for(int i = 0; i <= rows;i++)
{
for(int j = 0; j <= cols; j++)
{
World[i][j] = AllRooms[counter];
counter++;
printf("\nWorld %d", World[i][j]->roomNum);
}
}
}
struct PC startPointPC(struct PC* player,int rows, int cols, struct room*
World[rows][cols],struct PC* cords[rows][cols])
{
int x = 0;
int y = 0;
player->x = x;
player->y = y;
//cords[x][y] = player;
printf("\nYou are starting in Room %d",World[x][y]->roomNum);
return player;
}
此声明
AllRooms[8] = Room9;
访问数组之外的内存,该数组的元素在 [0, MaxRooms).
此外这样的赋值例如这个
AllRooms[0] = Room1;
可以调用未定义的行为,因为对象 Room1 未初始化并且其整数数据成员可以具有陷阱值。
您创建了一个一维数组
struct room AllRooms[MaxRooms];
并将其作为参数传递给函数 createRooms
createRooms(AllRooms);
表达式中的数组指示符(极少数例外)被转换为指向其第一个元素的指针。
所以实际上这个调用
createRooms(AllRooms);
等同于
createRooms(&AllRooms[0]);
并且参数的类型为 struct room *
。
然而,您声明的函数具有结构 room* AllRooms[]
类型的参数,编译器将其调整为 struct room **
.
编译器应发出一条错误消息,表明没有从一种类型的参数到另一种类型的函数参数的隐式转换。
此外,该函数应在其在 main 中使用之前声明。
也在这样的循环函数中
for(int i = 0;i <= MaxRooms; i++)
您使用的索引范围不正确。有效范围是 [0, MaxRooms)
所以函数至少应该按照下面的方式声明和定义
void createRooms( struct room AllRooms[] )
{
int MaxRooms = 8;
int number = 1;
for(int i = 0;i < MaxRooms; i++)
{
AllRooms[i].roomNum = number;
number++;
}
for(int i = 0;i < MaxRooms; i++)
{
printf("%d",AllRooms[i].roomNum);
}
}
使用函数
的局部变量MaxRooms
也是个坏主意
int MaxRooms = 8;
而不是传递指定数组大小的相应参数。
函数 createWorld 也存在类似问题。
应该像
那样声明和定义void createWorld( struct room AllRooms[], int rows, int cols, struct room World[rows][cols])
{
int counter = 0;
for(int i = 0; i < rows;i++)
{
for(int j = 0; j < cols; j++)
{
World[i][j] = AllRooms[counter];
counter++;
printf("\nWorld %d", World[i][j].roomNum);
}
}
}