array作为函数的参数

时间:2011-11-14 13:22:47

标签: c winapi function pointers

有一系列结构。

    static field fields[xsize][ysize];

我想在功能

中更改它
    void MoveLeft(pacman *Pacman, field **fields,int **play)

但是当我这样发送时

     MoveLeft(&Pacman,fields,play);

我收到了错误。

字段 - 结构

     typedef struct
     {
    blossom blossoms;
    wall walls;
     }field;

开花与开花墙 - 另一个结构

3 个答案:

答案 0 :(得分:2)

我猜错误如下:二维数组fields[xsize][ysize]是固定大小的数组(xsize / ysize是定义或consts),而在内存中这看起来不像field**,导致它指向指向字段的指针,而fields[xsize][ysize]内部只有一个固定大小的数组,编译器为你处理双索引。

所以您需要的只是将字段定义为field**并动态分配。

有关更多说明,请参见图片: enter image description here

答案 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);