かなり複雑な構造(ここでは "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():悪いタイプ
すべてのヘルプは高く評価されるだろう。
あなたの答えをありがとう。私は私の質問をより明確に説明しておくべきだった。私は、その詳細がメインプログラムから隠された構造を持っている必要があります(閉じたソースライブラリになるサブルーチンでしか見えません)。だから私は "i"と "j"の整数を使用しようとしました。私はMPIライブラリでも同様のことを見てきました。 MPI_TYPE_COMMIT(type、err)。型は整数として宣言され、構造体を指す可能性があります。別の試みがありますが、 "myMod"がバイナリファイルにコンパイルされている場合、 "sType"コンポーネントが認識できるかどうかはわかりません。 http://web.eng.ucsd.edu/~mesmaily/test。f – mem
外部から見える型のポインタをライブラリ内で使用される内部の型に変換するには、おそらく 'transfer'関数を使いたいと思うでしょう。正式には、Fortran 90は強く型付けされたポインタしかサポートしていないので、おそらくコンパイラ/ランタイム固有のビヘイアがこれをしようとしています。 F2003をサポートできるのであれば、相互運用性の拡張は調査する価値があるかもしれませんが、Cのように適切なvoidポインタを処理する能力を得ることができます。 – talonmies