2011-11-14 189 views
1

有一个结构数组。数组作为函数的参数

static field fields[xsize][ysize]; 

我想改变它在功能上

void MoveLeft(pacman *Pacman, field **fields,int **play) 

但是,当我把它像这样

 MoveLeft(&Pacman,fields,play); 

我有一个错误。

场 - 结构

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

那里开花&墙 - 另一种结构

+6

你有一个错误...很酷:)什么错误? –

+0

究竟是什么错误? PS。我不确定,我不是真正的ac程序员,但你发送一个Pacman引用,而它期望一个指针...... –

+0

我不确定如果你需要在你的函数原型中指出**字段是双指针,因为它已经是'field'类型了。 – gkiar

回答

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); 
+0

现在我得到这个错误 '在pacma.exe 0x001f100e处未处理的异常:0xC0000005:访问冲突读取地址0x00000044'。 这是上一个方法的错误 –

+0

这听起来像是一个不同的问题。你必须调试程序。 – aschepler

+0

我已经解决了这个问题。我的数组在playinfo.h中播放[11] [31]。所以我简单地在moveprocs.h中包含levelinfo.h(其中futiontion为moveleft),现在它正常工作 –

-1

虽然我没有使用Windows,我猜你的错误是类似于这样:

error: cannot convert ‘field (*)[xx]’ to ‘field**’ for argument ‘2’ to ‘void MoveLeft(pacman*, field**,int**)’ 

解决方法是简单地将fields参数转换为函数所需的类型:

MoveLeft(&Pacman, (field **) fields, play); 
+0

是。这是错误,但这种方法不起作用。 –

+2

正确的错误,但可怕的答案;不要只是“抛弃问题” - 你在这里做的只是忽略错误,并告诉编译器无论如何继续。字段,定义为[] [],是一个连续的二维数组,而字段**是指向(隐含数组)的指针。这两者有着非常不同的内存布局;你不能只把另一个当作另一个。如果你这样做,你会试图把数组中的实际字段视为实际上的指针 - 如果你幸运的话,你会提前发生崩溃并意识到有什么问题。 – BrendanMcK

2

我想误差如下:二维数组fields[xsize][ysize]是固定大小的阵列(XSIZE/YSIZE是定义或consts),并在存储器这不是像field**,导致它的指针的指针的字段,而fields[xsize][ysize]内部只有一个固定大小的数组,其中编译器会为您处理双重索引。

所以你需要的只是将字段定义为field**并动态分配它。更多解释

见图片: enter image description here

+0

这是错误的。 'field **'表示指向'field'的指针。 “指向”field“指针数组的指针”将是field *(* fields)[]'。 'field **'是表示数组的好类型。只是Joachim Pileborg指出类型转换必须明确地完成。 –

+0

好吧,不要混淆术语让我们说,它是指针的指针。在内部他们都指向某些类型的缓冲区... –

+0

@undur_gongor恕我直言,你错了。一个'field [] [N]'和一个'*(field [N])'具有相同的内存布局。一个'field **'和一个'(* field)[]'也是如此,但与第一个不同。 – glglgl