2011-08-07 10 views
1

かなり複雑な構造(ここでは "real a(2)"に置き換えられます)のハンドルを作成してから、メインルーチンにハンドル/ポインタを渡すだけです。私はまた、必要とされるこれらの構造の多くを作り出すことができる必要があります。 問題は、ポインタがmainに返されるとデータ構造体の割り当てが解除されることです。ここに私の試みは次のとおりです。FORTRANルーチン内で構造体/配列のハンドルを作成する方法は?

program main 
    implicit none 

    integer i, j 
    real a(2) ! This can be a complicated structure 

    a=(/1.1,2.2/) 
    call myalloc(a,i) 

    a=(/3.1,4.2/) 
    call myalloc(a,j) 

    call myprint(i)  
    call myprint(j) 

    stop 
    end 

C -----------------------------------

subroutine myalloc(a,i) 
    implicit none 

    real, pointer :: i(:) ! If I add "save" attribute I will get an error 
    real, target :: a(2) 

    allocate(i(2)) 
    i => a 

    return 
    end 

C --------------------------------

subroutine myprint (i) 
    implicit none 

    real, pointer :: i(:) 

    print *, i 

    return 
    end 

C ---- -----------------------------

結果はいくつかのゴミ値です: 3.93764868E-43 1.40129846E-45

または私はなるだろう:ファイルtest.fのライン41で (単位= 6、ファイル= 'STDOUT') 内部エラー:list_formatted_write():悪いタイプ

すべてのヘルプは高く評価されるだろう。

答えて

1

このコードでは間違いがあります。建設的に答えるのはほとんど難しいです。

サブルーチンmyallocは、ソートのコピーコンストラクタのように動作すると想定されています - 指定されたポインタにメモリを割り当て、初期化引数の内容を割り当てられたメモリにコピーします。ここで

allocate(i(2)) 
    i => a 

あなたが最初aを指すようにiを割り当て、その後、ポインタiにメモリを割り当てる:だからあなたのmyallocでキーエラーは、これらの2行はあります。この場合、なぜ私は割り振りますか?私は、これはあなたがやろうとしているものに近い推測:

subroutine myalloc(a,b,n) 
    implicit none 

    real, dimension(n) :: a 
    real, pointer,dimension(:) :: b 
    integer :: n 

    allocate(b(n)) 
    b = a ! This copies the contents of the array a to the allocation for b 

    return 
end 

は、その後、あなたのメインプログラムに不可解なものがいくつかあります。 ijが整数として宣言されているのはなぜですか?確かに実際の配列へのポインタでなければなりません。myallocに配列を渡して、割り付け/コピー操作を実行してから、それらを印刷するのですか?その場合は、その後、このような何かにあなたのメインを変更すると、あなたがやろうとしていると思われるものに近づけるようになります。

$ ./pointer 
    1.100000  2.200000  
    3.100000  4.200000  
:これらの変更により

program main 
    implicit none 

    interface 
     subroutine myalloc(a,b,n) 
     real,dimension(n) :: a 
     real,pointer,dimension(:) :: b 
     integer :: n 
     end subroutine myalloc 

     subroutine myprint(i) 
     real,pointer,dimension(:) :: i 
     end subroutine myprint 
    end interface 

    real,pointer,dimension(:) :: i, j 
    real :: a(2) 

    a=(/1.1,2.2/) 
    call myalloc(a,i,2) 

    a=(/3.1,4.2/) 
    call myalloc(a,j,2) 

    call myprint(i) 
    call myprint(j) 

    stop 
end 

実行したとき、あなたはこれを取得する必要があります

出力として期待していたものに近いですか?

+0

あなたの答えをありがとう。私は私の質問をより明確に説明しておくべきだった。私は、その詳細がメインプログラムから隠された構造を持っている必要があります(閉じたソースライブラリになるサブルーチンでしか見えません)。だから私は "i"と "j"の整数を使用しようとしました。私はMPIライブラリでも同様のことを見てきました。 MPI_TYPE_COMMIT(type、err)。型は整数として宣言され、構造体を指す可能性があります。別の試みがありますが、 "myMod"がバイナリファイルにコンパイルされている場合、 "sType"コンポーネントが認識できるかどうかはわかりません。 http://web.eng.ucsd.edu/~mesmaily/test。f – mem

+0

外部から見える型のポインタをライブラリ内で使用される内部の型に変換するには、おそらく 'transfer'関数を使いたいと思うでしょう。正式には、Fortran 90は強く型付けされたポインタしかサポートしていないので、おそらくコンパイラ/ランタイム固有のビヘイアがこれをしようとしています。 F2003をサポートできるのであれば、相互運用性の拡張は調査する価値があるかもしれませんが、Cのように適切なvoidポインタを処理する能力を得ることができます。 – talonmies

関連する問題