3

我想将函数内部的平面 1D 数组视为 3D 数组。我知道我可以使用宏来翻译这样的坐标:

#define f3d(x,y,z,nx,ny) ( (z)*(nx)*(ny) + (y)*(nx) + (x))

但是我的老师告诉我有一种方法可以简单地将它们转换为函数调用。因此,以下测试程序与编译器调用完美配合:gcc -std=c99 -o test.exe main.c

主.c:

#include <stdlib.h>
#include <stdio.h>
static void init(int n, double a[n][n][n]){  
  for(int i=0; i<n; i++)
    for(int j=0; j<n; j++)
      for(int k=0; k<n; k++)
        a[i][j][k] = i;
}

int main(int argc, char **argv){
  int n = 5;
  double *a = malloc(n*n*n*sizeof(*a));
  init(n, (double (*)[n][n])a);
  for(int i=0; i<n*n*n; i++)printf("%lf ",a[i]);    
  return 0;
}

但是现在我必须使用 C++ 并且无法编译它: g++ -o test.exe main.c 编译器说error: array bound is not an integer constant 我可以想象为什么编译器与可变数组长度作斗争,但为什么它在 C 中工作?

有人可以告诉我为什么吗?

有没有解决这个问题的方法?

提前致谢!

更新:非常感谢您的回答,但现在我很困惑。我使用 g++ (SUSE Linux) 4.4.1 [gcc-4_4-branch revision 150839],它应该能够支持 VLA。为什么它不编译并抛出“错误:数组绑定不是整数常量”?

4

1 回答 1

2

来自海湾合作委员会:

http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html

ISO C99 允许可变长度自动数组,作为扩展,GCC 在 C90 模式和 C++ 中接受它们。这些数组的声明与任何其他自动数组一样,但其长度不是常量表达式。存储在声明时分配,并在退出大括号级别时释放。...

您还可以使用可变长度数组作为函数的参数:

 struct entry
 tester (int len, char data[len][len])
 {
   /* ... */
 }
于 2012-07-15T02:54:33.427 回答