2次元配列を関数に渡したい/3次元配列を取りたい

行列をまるごと関数に引き渡したい、と言う欲望が出て来ることも ままあるでしょう。こんな時はどうすればよいのでしょう? とくに、配列の大きさを実行ファイルの 引数として渡したい のページで配列の大きさをコンパイル後に 渡すには???

これについては過去に苦い経験があり、行列で宣言した変数を そのまま関数に引き渡すことは お勧めできません 。 お勧めできる方法は次の2通りです。

(方法1)大域変数として宣言し、関数の引数に入れるのをあきらめる
(方法2)ベクトルとして宣言し、これを畳んで行列として使う

方法1は main 関数の外で定義するだけ、という明解簡単な方法で、 初心者にはお勧めです。 ただし、個人でライブラリなどを作ろうとしている人には、 汎用性がないというデメリットの方が大きいでしょう。 そこで個人的にお勧めなのは方法2です。行列で宣言したとしても、 結局中でやっていることはベクトルを折り畳んでいるだけなので、 計算の手間としても変わらないからです。 では、方法2を実行するプログラム例を示しましょう。

と、その前に。
このページのもう一つのお題の3次元配列ですが、Cでは できません。 x[i][j][k] という配列はないんですね。 というわけで、何次元になろうとも1次元配列を折り畳んで使ってしまうのが統一も取れて美しいと思います。

以上の理由で、ここでは、ベクトル(1次元配列)を関数に引き渡す例を示します。


/* 1次元配列を関数に引き渡す例 */
#include < stdio.h > 
 
void f(double *x, int N){/* 変数の受け取り方 */
	int n;
	for(n=0; n<N; n++)
		printf("%d %f\n",n,x[n]); /* 変数の値 */
}

int main(){ 
	int N=3;
	double x[N]; /* これより前に N が確定しているのでOK 
		        お好みで、N を実行ファイルの引数にすることも可能。
                        引数を作るページとメモリアロケーションのページを参照。*/
	f(x,N); /* 変数の渡し方 */
	return 0;
}