サイズが事前に分かっていなくても、それがそんなに大きくなければ
#define MAXM (10) #define MAXN (10) int main(void) { double b[MAXM][MAXN]; // これは 800 バイトのメモリを占める (と分かる?) int m, n, i, j; printf("m,n="); scanf("%d%d", &m, &n); if (m > MAXM || n > MAXN) { // 一応エラー・チェック ... } for (i = 0; i < m; i++) for (j = 0; j < n; j++) ... |
でもあまりお勧めできない。 ベクトルならば大したことにはならないだろうけれど、 行列の場合はサイズの制限は案外きつい。 自分が現在使っている C 言語処理系で、 スタック領域のデフォールトのサイズがいくらであるか、 即答できる人は多くないだろう (僕は覚えていません -- 今使っている Mac で調べたら 8MB だった)。
サイズが事前にわからない、ある程度以上大きい、という場合、 次のようにする方がよい。
#define MAXM (200) #define MAXN (200) double a[MAXM][MAXN]; // 静的に大きめに確保 int main(void) { int m, n, i, j; printf("m,n="); scanf("%d%d", &m, &n); ... |
上と変わらないように感じるかもしれないが、 a を関数の外で定義する (静的変数として定義する) ことが重要なポイントである。 これならばスタック領域のサイズは気にならない。
このやり方はまあまあ使える。 しかし関数に引数として渡すときに少し悩ましいことが起こる。 これは案外、説明に手間取るので、項を改める。
桂田 祐史