B..2.0.1 細かい注意

実は古いC言語では、
void gauss(double a[][NDIM],f[],int n)
(ただしNDIM は定数)
のように、[] 内の数は定数にしなければならなかった。 上のプログラムでは ndim という引数を用いているが、 それは ``整合配列引数'' という、特殊な機能を 用いている。 その機能は, C99 規格には入ったが、より新しい規格ではオプション扱いになった。 現在普及している多くの C コンパイラーではコンパイル出来るが、 将来はどうなるか分からない。 DO 文は for 文にする。 繰り返す範囲を文番号を用いて、 DO 文番号 制御変数=出発値,... のように指定してあるのを読み取って、 必要に応じて、 かっこ { } で適当にブロックを作る。 例えば
          DO 1 K=I+1,N
    1     A(J,K)=A(J,K)-AA*A(I,K)
          for (k=i+1;k<n;k++)
            a[j][k] -= aa * a[i][k];
とすれば良い (かっこはつけても良いが、なくても構わない)。
      DO 3 I=1,N-1
        DO 2 J=I+1,N
          AA=A(J,I)/A(I,I)
          DO 1 K=I+1,N
    1     A(J,K)=A(J,K)-AA*A(I,K)
          F(J)=F(J)-AA*F(I)
    2   CONTINUE
    3 CONTINUE
      for (i=0;i<n-1;i++) {
        for (j=i+1;j<n;j++) {
          aa = a[j][i] / a[i][i];
          for (k=i+1;k<N;k++)
            a[j][k] -= aa * a[i][k];
          f[j] -= aa * f[i];
        }
      }
とすれば良い (一番外側のカッコは不要である)。

桂田 祐史
2018-06-08