WRITE(*,*) 'BACKWARD : METHOD=1, ', 1 'CENTRAL : =2, ', 2 'FORWARD : =3'(6桁目にブランクでない文字 1,2 を置いている、 継続行であることを意味する。) |
printf("BACKWARD : METHOD=1, CENTRAL : =2, FORWARD : =3\n"); |
C 菊地文雄, 山本昌宏「微分方程式と計算機演習」, 山海堂 (1991), P. 13 |
// 菊地文雄, 山本昌宏「微分方程式と計算機演習」, 山海堂 (1991), P. 13 |
ともあれ、C言語では、変数宣言は絶対にサボれないので、ちゃんと書く必要がある。 IJKLMN ルールを使っているので、 先頭の文字が I,J,K,L,M,N のいずれかの 場合は int 型に、そうでない場合は double 型にした。 (もとの FORTRANプログラムは単精度(REAL)なので、 double でなく float にすべきかもしれないが、 C言語で float の利用はあまり推奨できないので double にした。)
(変数宣言なし) |
int i,j,k; double aa; |
DIMENSION A(NDIM,NDIM),F(NDIM) |
int n, i, j; double a[NDIM][NDIM], f[NDIM]; |
例えば、B(1) は b[0] に, A(N) は a[n-1] に直す。 また
DO 2 I=1,N DO 1 J=1,N READ(*,*) A(I,J) 1 CONTINUE 2 CONTINUE |
for (i=0; i<n; i++) for (j=0; j<n; j++) scanf("%lf"< &a[i][j]; |
PARAMETER (NDIM=100) DIMENSION A(NDIM,NDIM),F(NDIM) |
#define NDIM (100 double a[NDIM][NDIM], f[NDIM]; |
次元 N 以上の数NDIMを取って、大きめの変数を用意しておく、 ということである。 古いFORTRANでは、動的な変数宣言は出来ず、 プログラムをコンパイルする時点で、 変数の大きさを決めておく必要があるので、 このようなプログラムになっている (そうするより仕方がない)。 最近のプログラミング言語では、動的な変数宣言が出来るのが普通なので、 古めかしい書き方であると言える。
例えば C 言語であれば、ベクトルを記憶する変数 f は
#include <stdlib.h> // malloc() のため int N; double *f; // N を決めてから f = malloc(sizeof(double) * N); if (f == NULL) { } // エラー処理 |
SUBROUTINE GAUSS(A,F,N,NDIM) DIMENSION A(NDIM,NDIM),F(NDIM) |
void gauss(double a[ndim][ndim],f[ndim],int n, int ndim) |
void gauss(int ndim,double a[ndim][ndim],double f[ndim],int n) |
void gauss(int ndim,double a[][ndim],double f[],int n) |
// n次元ベクトル x,y の内積を計算する関数 double naiseki(double x[], double y[], int n) |