3

関数内でフラットな 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 に対応している必要があります。コンパイルされず、「エラー: バインドされた配列は整数定数ではありません」がスローされるのはなぜですか?

4

1 に答える 1

2

GCC から:

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 に答える