• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:fortran 配列受け渡し時の次元の一致)

Fortran配列受け渡し時の次元の一致と中身の挙動について

このQ&Aのポイント
  • Fortran90のコンパイラifortを使用して、配列の受け渡しについて調査しています。通常、メインプログラムとサブルーチン間で配列を受け渡す場合は、次元を揃えて渡すことが一般的です。しかし、あるコードでは2次元配列を渡して1次元配列で受け取っていました。テストコードを作成して実行した結果、コンパイルは通りましたが、サブルーチン側ではすべての要素が0で置き換えられるという結果でした。これはコンパイラの違いによるものでしょうか?
  • 質問をまとめると、次元の異なる配列の受け渡しが可能かどうか、そしてその場合の配列の中身について知りたいです。
  • よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • f272
  • ベストアンサー率46% (8529/18257)
回答No.1

(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 この順です。アクセスの効率が異なります。

naeba123
質問者

お礼

サンプルありがとう御座います。 無事解決しました。 また、doループのアクセス効率に関するご指摘もありがとうございました。 勉強になりました。

その他の回答 (1)

  • boogeyman
  • ベストアンサー率35% (163/462)
回答No.2

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) のようなに数値が受け渡されると思います。

naeba123
質問者

お礼

どうやら私の環境ではできないようです。 Segmentation fault になりました、、、 変数の中身の置換され方はわかりやすかったです。 ありがとうございました。

関連するQ&A

専門家に質問してみよう