- ベストアンサー
フォートランの配列の受け渡し問題
いまどき、フォートランの配列について質問します。 配列の実引数(メイン側の配列変数)とサブルーチン側の変数(仮引数の配列変数)の受け渡しですが、配列のサイズを変動させることが可能でしょうか。 program main dimension x(100) ! xの最大配列サイズ100 .... call abc(x,np) ! 実際にはxはnp(<100)個の配列とする。 .... subroutine abc(xx,nx) ! x->xx(仮引数,配列サイズはnx=np) dimension xx(1) ! 配列の先頭を示しておく。 .... こうしておくと、サブルーチンabcで利用する配列は呼び出し側でnp(=nx,=<100)を変更することによってサイズをダイナミックに変動できると思っています。実験すると大丈夫なようです。 では、2次元、3次元の配列では配列のサイズを変数でコントロールするにはどうしたらいいでしょうか。実引数と仮引数で名前以外の変数情報を一致させるというのが教科書的な対応だと思いますが、ダイナミックに変数を変化させるにはどうしたらいいでしょうか。 追加ですが、プログラムに対して外部データを入力させる場合のnamelist入力について解説しているサイトとか本があるでしょうか。これは古臭い(フォートランでさえ古いですが、さらに古い)やり方かと思いますが、解説本には載っていないようです。 以上、よろしくお願いします。 ところで、フォートランの復権なんてことはやはりないのでしょうか。ポインタなども導入されてC言語みたいになってきているとは思いますが。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
具体的にどのようなことがしたいのか分かりませんが、fortran90以降であれば、配列の大きさを動的に扱うことは容易にできます。 意図していることと違うかもしれませんが、サンプルコードを以下にあげておきます。 fortran77でもできますが、コードが少し長くなるとおもいます。 program hoge real(8) a(3,3) integer n a(1,:)=(/1.d0,2.d0,3.d0/) a(2,:)=(/4.d0,5.d0,6.d0/) a(3,:)=(/7.d0,8.d0,9.d0/) n=2 call foo(a(1:n,1:n),n) end program hoge subroutine foo(b,n) integer,intent(in)::n real(8),intent(in)::b(n,n) integer i do i=1,n write(*,*) b(i,:) end do end subroutine foo
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
下は「namelist」で検索すればいいので上だけ. サブルーチンの方の dimension xx(1) は「たまたまうまくいっている」と思った方がよいと思います. 正しくは整合配列として dimension xx(nx) のように定義する. もしくは, (FORTRAN でなく Fortran なら) 形状引継ぎ配列を使う. ああ, 「名前以外の変数情報を一致させる」ってのは意味不明だな. しかし, 今どき dimension って使うの?
お礼
回答有難うございます。大いに参考にさせて頂きます。