私は簡潔なタイトルに苦労していますが、それほど複雑ではありません。構造体(派生型)を返す関数があり、関数を呼び出すときに構造体の一部だけを参照する簡単な方法を探しています(別の構造体をコピー/ポインティングすることなく)。構造体/派生型を返す関数の参照
program main
real :: xx = 1.
real :: yy = 2.
! works fine but what I want is to be
! able to return %tx and %ts separately
print *, " tax ", tax(xx,yy)
! just guessing at possible syntax here, but neither works
print *, " tax ", tax%tx(xx,yy)
print *, " tax ", tax(xx,yy)%tx
contains
function tax(x,y)
real :: x, y
type tTax
real :: tx, ty
end type tTax
type(tTax) :: tax
tax%tx = x * 100.
tax%ty = y * 100.
end function tax
end program main
私はf90/f95機能セットに制限されていますが、f2003回答も含めてください。
私は本当にここに単純なものがあればそれを探しています。さもなければ、サブルーチンとして行うほうが良いでしょう(代わりにポインタを関数として保持していますが、ポインタやインタフェースなどを追加している場合)。
構造体の代わりに2次元配列を返しても同じ基本的な問題がありました。機能はありますが、配列セクション全体を印刷することはできません。
()
が索引付け[]
を使用してPythonのような言語とは対照的に、(FORTRANの関数や配列セクションの両方に使用するので、それは機能やインデックスなどを混在させるような何かかなり自然なことですされているので、私もそこに構文を推測トラブルがありましたtax(xx,yy)[1,:]
)。
ありがとうございます。私が疑問に思ったように、fortranはこの余分な作業をして、実用的な観点からは少し単純なのでサブルーチンを使うかもしれません - そして、現時点ではそれをテストするのに十分な新しいコンパイラがありませんとにかく;-)しかし、これはクールです、ありがとう! – JohnE
私はf2003なしで知っている私はメインで 'associate()'を使用することはできませんが、モジュール自体は私のためにコンパイルする必要がありますか?私のf90コンパイラは、タイプとインターフェイスの両方についてtTaxの名前を使用して文句を言いますが、別々にコンパイルします(もちろんメインはこれらのケースでは機能しません)。私がtxではなくmainでfoo%txを使うことができれば、私のperspeciveから十分な解決策になるでしょう。 – JohnE
@VladimirFまたはjlok:ここのコメントに簡単に答えがありますか?それとも別の質問として聞く価値があるのですか? – JohnE