【问题标题】:array as parameter of a function数组作为函数的参数
【发布时间】:2011-11-14 13:22:46
【问题描述】:

有一个结构数组。

    static field fields[xsize][ysize];

我想在功能上改一下

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

但是当我这样发送时

     MoveLeft(&Pacman,fields,play);

我有一个错误。

字段 - 结构

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

在哪里开花和墙 - 另一个结构

【问题讨论】:

  • 你遇到了一个错误...酷 :) 什么错误?
  • 没错,什么错误? PS。我不确定,我不是一个真正的 c 程序员,但你发送了一个 Pacman 引用,而它需要一个指针......
  • 我不确定您是否需要在函数原型中指出 **fields 是双指针,因为它已经是 field 类型。
  • @MichalB.: &Pacman 是一个指针,C 没有引用类型。

标签: c winapi function pointers


【解决方案1】:

尽管数组和指针在 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);

【讨论】:

  • 现在我收到了这个错误Unhandled exception at 0x001f100e in pacma.exe: 0xC0000005: Access violation reading location 0x00000044。最后一个方法是错误的
  • 这听起来像是一个不同的问题。您必须调试程序。
  • 我已经解决了这个问题。我的数组 play[11][31] 在 levelinfo.h 中。所以我简单地将 levelinfo.h 包含在 moveprocs.h(函数 moveleft 所在的位置)中,现在它可以正常工作了
【解决方案2】:

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

所以您只需将字段定义为field** 并动态分配即可。

更多解释见图片:

【讨论】:

  • 这是错误的。 field** 表示指向field 的指针。 “指向field 的指针数组的指针”将是field *(*fields)[]field** 是表示数组的好类型。正如 Joachim Pileborg 所指出的,只是类型转换必须明确完成。
  • 好的,为了不与术语混淆,假设它是指向指针的指针。在内部,它们都是指向某些类型缓冲区的指针...
  • @undur_gongor 恕我直言,你错了。 field[][N]*(field[N]) 具有相同的内存布局。 field**(*field)[] 也是如此,但与第一个不同。
  • @glglgl:是的,我完全错了(最后两句话)。对不起。最后,阿舍普勒做对了。
【解决方案3】:

虽然我没有使用 Windows,但我猜您的错误类似于以下内容:

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

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

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

【讨论】:

  • 正确的错误,但糟糕的答案;永远不要只是“抛弃问题”-您在这里所做的只是忽略错误,并告诉编译器无论如何都继续。定义为 [][] 的 fields 是一个连续的 2D 数组,而 field** 是一个指向指针(隐含数组)的指针。两者有非常不同的内存布局;你不能把一个当作另一个。如果这样做,您将尝试将数组中的实际字段视为实际上是指针 - 如果幸运的话,您会尽早崩溃并意识到有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
  • 2011-02-21
相关资源
最近更新 更多