5

私は次のプログラムを持っています

module test
contains
   subroutine foo()
      integer, allocatable :: a(:)
      allocate(a(-5:5))
      call bar(a)
      print *, a
   end subroutine
   subroutine bar(a)
      integer, intent(out) :: a(:)
      a = 0 
      a(-4) = 3  ! here
      a(2) = 3   
   end subroutine
end module

program x
   use test
   call foo()
end program

「ここ」でマークされた行で、私は何か間違ったことをしています。実際には、私が配列を受け取るとa(-5 から +5 まで割り当てられた呼び出し元で)、呼び出し先は従来の番号付け (1 から n) を使用します。つまり、-4 を割り当てると、境界外の割り当てが行われます。barルーチン内で、a配列の番号付けが呼び出し元と同じでなければならないことをコンパイラーにどのように指示できますか?

4

3 に答える 3

4

サブルーチンで使用している仮引数の型で、次元をコロンで指定したものを「想定形状」と呼びます。この名前が手がかりです。Fortran は形状のみを渡し、下限と上限は渡しません。下限は、kemiisto の回答に示されているようにオーバーライドしない限り、1 と見なされます。下限が固定されていない場合は、下限として使用する引数を渡すことができます。

後で追加: コンパイル時に下位の次元がわからない場合のコード例:

subroutine example (low, array)
   integer, intent (in) :: low
   real, dimension (low:), intent (out) :: array
于 2010-12-06T15:27:02.443 に答える
3

2 つの一般的なオプションがあります。

  • kemisto が書いたように、2 番目の引数を渡します。これは、F77 スタイルのコードでは一般的でした。LBOUND トリックは使用できません。整数として渡す必要があります。
  • 引数は、配列記述子全体を含むポインタとして宣言します。サブルーチン内の配列の境界は、呼び出しスコープ内と同じです。もちろん、この方法では最適化に失敗する可能性があります。
于 2010-12-07T10:44:15.133 に答える
2

bar ルーチン内で、配列の番号付けが呼び出し元と同じでなければならないことをコンパイラーに指示するにはどうすればよいですか?

確かではありませんが、標準によれば、想定形状配列の下限を指定できます。

subroutine bar(a)
      integer, intent(out) :: a(-5:)
于 2010-12-06T14:08:26.983 に答える