関数内でフラットな 1D 配列を 3D 配列として扱いたいと思います。マクロを使用して座標を次のように変換できることはわかっています。
#define f3d(x,y,z,nx,ny) ( (z)*(nx)*(ny) + (y)*(nx) + (x))
しかし、私の先生は、関数呼び出しで単純にキャストする方法があると教えてくれました。したがって、次のテスト プログラムは、コンパイラ呼び出しで完全に正常に動作しています。gcc -std=c99 -o test.exe main.c
main.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
Compiler はerror: array bound is not an integer constant
、コンパイラが可変配列長に苦労する理由を想像できると言っていますが、なぜ C で動作しているのでしょうか?
誰かが理由を教えてもらえますか?
また、この問題の回避策はありますか?
前もって感謝します!
更新:回答ありがとうございますが、今は混乱しています。私は g++ (SUSE Linux) 4.4.1 [gcc-4_4-branch Revision 150839] を使用しています。これは VLA に対応している必要があります。コンパイルされず、「エラー: バインドされた配列は整数定数ではありません」がスローされるのはなぜですか?