0

配列ポインタのアドレスを取得したいと思います。プロトタイプ コードは次のとおりです。

program main

    implicit none

    type foo
        integer, allocatable :: i(:)
        integer j
    end type

    type(foo) a
    integer, pointer :: ai(:)

    ai => a%i

    print *, "The address of a is ", loc(a)
    print *, "The address of a%i is", loc(ai) ! <--- I expect the same address as a.

end program main

私の最終的な目標は、 type(foo) の最初の部分であるため、配列 pointer のアドレスからawithのアドレスを取得することです。type(foo)aii

前もって感謝します!

リー

4

2 に答える 2

1

Fortran は、ユーザー定義の最初の項目がそのユーザー定義型と同じアドレスであることを保証しません。アイテムの前にヘッダーがあるかもしれません。たぶん、いくつかのパディングがあります。おそらく、コンパイラはアイテムを別の順序で保存します。たぶん、異なるコンパイラは異なる方法でそれを行います。これは指定されていません。そのため、ご期待に添えない場合があります。Fortran では、アドレスはほとんど必要ありません。あなたは何をしようとしているのですか?C にインターフェイスしている場合、ISO_C_Binding は C_LOC を提供します。

コメントに応じて編集します。先頭の "a %" を省略して変数名を簡略化することが目標の場合は、ポインターを使用して、同じストレージにアクセスする代替変数を作成できます。ポインターを使用して言語を乗り越えようとする必要はありません。例:

program main

    implicit none

    type foo
        integer, pointer :: i(:)
        integer j
    end type

    type(foo) a
    integer, pointer :: ai(:)

    allocate ( a%i (5) )
    a%i = [ 2, 5, 1, 3, 9 ]
    ai => a%i

    write (*, '( "a%i=", 5(2X,I2) )' ) a%i
    write (*, '( "ai=", 5(2X,I2) )' ) ai

end program main

出力は次のとおりです。

a%i=   2   5   1   3   9
ai=   2   5   1   3   9
于 2012-09-27T02:33:49.313 に答える
0

とにかく標準のFortranを使用しないことはできません。

あなたの期待は見当違いであることに注意してください。

locは拡張機能です。プロセッサ固有ですが、通常は、引数が表すデータオブジェクトのアドレスの整数表現を提供します。(F2003規格のC_LOCはほぼ同等です。)この場合、データオブジェクトは割り当て可能な配列です。私が知っているすべてのプロセッサで、その配列のストレージは、割り当て可能なコンポーネントをホストする派生型のオブジェクトのストレージにはありません。派生型オブジェクトには、配列自体のストレージではなく、配列が格納されている場所(および配列の大きさなど)を記述する記述子が含まれているだけです。

于 2012-09-27T02:40:41.437 に答える