配列の大きさを実行ファイルの引数として渡したい

実行ファイルに引数を取らせたい のページで実行ファイルに引数を取らせることができるようになったら 今度は何がしたいでしょう?そうです、配列の大きさを引数として 取らせることができればなんて便利なんでしょう。 例えば、自由度が N で決まるプログラムを書いたとしましょう。 自由度 N を引数として取らせられれば、このパラメータも 寝ている間にサーチできます。

ここで厄介なのは、配列は普通大きさを決めて宣言するものだ、 ということです。大きさを 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;
}

x[N] と書いた以上、N は決まった値でないと困るわけです。 さてどうするか。ここで使うのは、 Memory Allocation (メモリーアロケーション) という方法です。
/* うまく行くプログラム */ 
#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] です。 また、この方法で行列を確保したかったら、 必要なだけのベクトルを取っておいてそれを折り畳む方法が簡単でしょう。

1次元配列を折り畳んで2次元配列を作る

NxN の行列なら、
[ 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つ)を確保するルーチンまであります。