例えば2つの 次正方行列 a, b の積を計算して、 その結果を c に代入する関数を考えてみよう。 Fortran の場合は次のようにすれば良い。
サブルーチン |
subroutine mulmat(c, a, b, ldim, n) integer ldim, n real*8 c(ldim,*), a(ldim,*), b(ldim,*) integer i,j,k real*8 s do i=1,n do j=1,n s=0.0 do k=1,n s=s+a(i,k)*b(k,j) end do c(i,j)=s end do end do |
サブルーチンを呼び出す側 (例えばメイン・プログラム) |
call mulmat(c, a, b, MAXM, n) |
さて、それで C の場合であるが、C には Fortran のような整合配列の機能はない。 しかし C99 で導入された可変長配列の機能を使うとほぼ同じことが出来る。
関数 |
void mulmat(int n, int cols, double a[][cols], double b[][cols], double c[][cols]) { int i, j, k; double s; // 略 for (i=0; i<n; i++) for (j=0; j<n; j++) { s=0.0; for (k=0;... } |
関数を呼び出す側 (例えば main() から) |
mulmat(n, MAXN, a, b, c); |
古い C では、可変長配列が使えなかったため、
個人的には 4 節で紹介するやり方を使い
(M師匠に教わったんだっけ)、学生にも勧めていた。
そのうちに GCC で可変長配列が導入され、
C99 で規格化されたので、この項で説明したやり方が可能になったが、
C99 の次の規格 C11 では、可変長配列の機能はオプショナルとされたので、
このやり方を人に勧めて良いか、迷うところである
(使っている人を見て、止めようとまでは思わない)。