- ベストアンサー
Fortran配列受け渡し時の次元の一致と中身の挙動について
- Fortran90のコンパイラifortを使用して、配列の受け渡しについて調査しています。通常、メインプログラムとサブルーチン間で配列を受け渡す場合は、次元を揃えて渡すことが一般的です。しかし、あるコードでは2次元配列を渡して1次元配列で受け取っていました。テストコードを作成して実行した結果、コンパイルは通りましたが、サブルーチン側ではすべての要素が0で置き換えられるという結果でした。これはコンパイラの違いによるものでしょうか?
- 質問をまとめると、次元の異なる配列の受け渡しが可能かどうか、そしてその場合の配列の中身について知りたいです。
- よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
(1)次元の異なる配列の受け渡しができるかどうか 昔はできたんだけどねえ。 (2)その場合中身はどうなるか 下記を実行してみればわかる。 program testa implicit none interface subroutine sub1(b) integer b(:) end subroutine end interface integer :: a(3,3),i,j do i=1,3 do j=1,3 a(i,j)=j+(i-1)*3 enddo enddo do i=1,3 do j=1,3 write(6,*) a(i,j) enddo enddo !call sub1(a) call sub1(reshape(a,(/3*3/))) end program subroutine sub1(b) integer :: b(:),i do i=1,ubound(b,1) write(6,*) b(i),'sub' enddo end subroutine ちなみに do i=1,3 do j=1,3 write(6,*) a(i,j) enddo enddo こういうアクセスの仕方はやめた方がいいよ。推奨されるのは do j=1,3 do i=1,3 write(6,*) a(i,j) enddo enddo この順です。アクセスの効率が異なります。
その他の回答 (1)
- boogeyman
- ベストアンサー率35% (163/462)
subroutine sub1(b) integer :: b(1),i か integer :: b(*),i にすれば、 b(1) ← a(1,1) b(2) ← a(2,1) b(3) ← a(3,1) b(4) ← a(1,2) b(5) ← a(2,2) b(6) ← a(3,2) b(7) ← a(1,3) b(8) ← a(2,3) b(9) ← a(3,3) のようなに数値が受け渡されると思います。
お礼
どうやら私の環境ではできないようです。 Segmentation fault になりました、、、 変数の中身の置換され方はわかりやすかったです。 ありがとうございました。
お礼
サンプルありがとう御座います。 無事解決しました。 また、doループのアクセス効率に関するご指摘もありがとうございました。 勉強になりました。