古いFORTRANのソースコードに以下のような記述がありました。サブプログラムへの引数の引き渡し方がC#とは大きく異なるようです。2次元の配列を1次元で引き渡したり、その逆程度あれば理解できるのですが、配列の特定の要素を2次元配列で受け取るようなやり方は配列の要素がどのように対応するのか全く理解できません。
どなたか、こうした引数の引き渡しについて、配列の要素レベルで、どのようなやりとりになるのかお教え願います。
Main側
integer mx , my , mz , lwrk , lww 整数の定義
real x(mx) , z(mx*my) , wrk(lwrk) 実数の配列の定義
mz=mx*my
call sub1( x , mx , z , mz , wrk(lww) , lwrk) サブプログラムsub1の呼び出し
stop
end
Subroutine側
subroutine sub1( x , mx , z , mz , wrk , lwrk) サブプログラムsub1
integer mx , mz , lwrk メイン側と一致
real x(mx) , z(mz) , wrk(lwrk) メイン側と一致
call subsub1( x , mx , z , mz , kx1 , kx2 , wrk(lsx) , wrk(lax)) サブプログラムsubsub1の呼び出し
疑問1 mainでは引数がwrk(lww)ですが、サブプログラムではwrkが対応する引数になり、ここから参照するsubsub1ではwrk(lsx)を引数としています。C#であればwrk(lww)とwrk(lsx)は配列でないため、何が行われているか理解できません。
return
end
subroutine subsub1( x , mx , z , mz , kx1 , kx2 , spx , ax) サブプログラムsubsub1
integer mx , mz , kx1 , kx2
real x(mx) , z(mz) , spx(mx,kx1) , ax(nx,kx2)
疑問2 sub1の引数wrk(lsx) , wrk(lax)が2次元の配列spx(mx,kx1) , ax(nx,kx2)に対応するようになっています。配列の引数lsxとlaxはどのような意味をもち、sub1のwrkの配列要素はどのように書き換えられるのでしょうか
do 200 it=1,mx
do 100 i=1,kx1
spx(it,i) = float(i*100)+float(it)
100 continue
200 continue
Reurn
End
補足
ポインター渡しと考え、配列の対応関係も示して頂き大変分かり易く説明して頂きどうも有り難うございました。 改めてですが、FORTRANとC#の配列の並び順についてお教え願います。 FORTRANで定義した配列wrk(nx,ny)はwrk(1,1),wrk(2,1).....wrk(nx,1),wrk(1,2),...wrk(nx,2).....wrk(nx,ny)の順で左側要素から順に増加して存在するが、C#で定義した配列wrk[nx,ny]はwrk[0,0],wrk[0,1].....wrk[0,ny-1],wrk[1,0],...wrk[1,ny-1].....wrk[nx-1,ny-1]の順で右側要素から順に増加して並んでいると考えてよろしいのでしょうか。