プログラミング演習1


― 課題4の付録2 ―

2次元配列の引き渡し

配列を関数(サブルーチン)とやりとりする場合、 受け取る側では主に2つのいくつかのやりかたがある。

(1)
グローバル変数でやり取りする。
(2)
関数(サブルーチン)の引数を介してやり取りする。
初心者のうちは(1)の方法しか知らなくてもやむを得ないが、 プログラムが大きくなるとグローバル変数の管理が大変になるので、 (2)のやり方のほうがより一般的で、エレガントである。
引数を介するやりかたにおいては、いくつかの書き方が許される。
  1. 配列の大きさ(サイズ)を明記する。
    int func(double x[3], double f[3])
    {
        ………………
    }
    
    大きさを事前に定数マクロとして定義しておくほうが便利なので、実際には
    #define ND 3
    int func(double x[ND], double f[ND])
    {
        ………………
    }
    
  2. (最上位の)配列の大きさを省略する。
    int func(double x[], double f[])
    {
        ………………
    }
    
2次元以上の配列では2つめの方法は要注意である。
int Jcalc(double x[], double J[][])
{
    ………………
}
では、エラーが出てしまう。
int Jcalc(double x[], double J[][ND])
{
    ………………
}
としなければならない。これは、引き渡された2次元配列が どこで折り返されているかという最低限のサイズ情報がないと、 配列の要素を特定できないからである。 省略できるのは最上位(一番左の[])の大きさのみである。
2次元情報を1次元配列に並べ替えておくといった安易な方法もある。
int Jcalc(double x[], double J[])
{
    ………………
    J[1] = …;  // J11
    J[2] = …;  // J12
    J[3] = …;  // J21
    J[4] = …;  // J22
}


【目次】 | 【1.】 | 【2.】 | 【3.】 | 【付録1】