有一系列结构。
static field fields[xsize][ysize];
我想在功能
中更改它 void MoveLeft(pacman *Pacman, field **fields,int **play)
但是当我这样发送时
MoveLeft(&Pacman,fields,play);
我收到了错误。
字段 - 结构
typedef struct
{
blossom blossoms;
wall walls;
}field;
开花与开花墙 - 另一个结构
答案 0 :(得分:2)
我猜错误如下:二维数组fields[xsize][ysize]
是固定大小的数组(xsize / ysize是定义或consts),而在内存中这看起来不像field**
,导致它指向指向字段的指针,而fields[xsize][ysize]
内部只有一个固定大小的数组,编译器为你处理双索引。
所以您需要的只是将字段定义为field**
并动态分配。
有关更多说明,请参见图片:
答案 1 :(得分:2)
尽管数组和指针在C中有些可互换,但它们并不完全相同。特别是,数组数组和指针数组在内存中的布局不同。
这是一种制作指针数组的方法,它引用与现有数组数组相同的数据:
field* field_rows[xsize];
for (unsigned int i=0; i<xsize; i++) {
field_rows[i] = fields[i];
}
然后可以将指向该field_rows
数组的指针传递给MoveLeft
:
MoveLeft(&Pacman,field_rows,play);
另一种解决方案可能是更改MoveLeft
的声明,而是指向数组数组:
void MoveLeft(pacman *Pacman, field fields[xsize][ysize], int **play);
MoveLeft(&Pacman,fields,play);
答案 2 :(得分:-1)
虽然我没有使用Windows,但我猜你的错误与此类似:
error: cannot convert ‘field (*)[xx]’ to ‘field**’ for argument ‘2’ to ‘void MoveLeft(pacman*, field**,int**)’
对此的解决方案是简单地将fields
参数强制转换为函数所需的类型:
MoveLeft(&Pacman, (field **) fields, play);