ここで厄介なのは、配列は普通大きさを決めて宣言するものだ、
ということです。大きさを N(まだ不定) で宣言しておいて、
引数で N を与えるなんてできるのでしょうか???
実はできません。
例えば、次のプログラムは エラーが起きます 。
/* エラーの出るプログラム */ #include < stdio.h > #include < stdlib.h > int main(int argi, char **argv){ int N; double x[N]; if(argi==2){ N = atoi(argv[1]); } else{ printf("Usage: N\n"); } return 0; }
/* うまく行くプログラム */ #include < stdio.h > #include < stdlib.h > int main(int argi, char **argv){ int N; double *x; if(argi==2){ N = atoi(argv[1]); if(NULL==(x=(double *)malloc(sizeof(double)*N))); /* 右から説明 sizeof(double) は、double 変数のバイト数。 malloc(a) は a バイトだけ、メモリ領域を確保しておく。 以上を double のポインタ型にキャストして、x に代入。 if(NULL)は以上の操作が成功したかどうかのチェック。 これで x[0]-x[N-1] が使えるようになった */ } else{ printf("Usage: N\n"); } return 0; }
[ x[0]...x[N-1] ] [ x[N]...x[2N-1] ] ... [ x[(N-1)*N]...x[N*N-1] ]という具合に、 i 行 j 列を (i-1)*N+j-1 番目の 1次元配列に入れてしまえばいいのです。 C の2次元配列 x[i][j] も内部では同じことをやっています。 C にはデフォルトでは3次元配列がありませんが、 同様にすれば疑似的に3次元配列も作れます。
Numerical Recipes in C という大変有用な本には x[k]-x[l] (k,l 任意)なる確保の仕方をするルーチンもあります。 この本には、行列や3階テンソル(添字が3つ)を確保するルーチンまであります。