我想将函数内部的平面 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。为什么它不编译并抛出“错误:数组绑定不是整数常量”?