ここで厄介なのは、配列は普通大きさを決めて宣言するものだ、
ということです。大きさを 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つ)を確保するルーチンまであります。