Fortranへのデータの取り回しは、C言語と同じように構造体を使うとok。C++ならばクラスを使いたいところなのだが、Fotranで扱うことはできないので構造体(TYPE)で。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | module structmodule implicit none ! struct define type F3D double precision :: x,y,z end type F3D contains ! struct parameter double precision function flen( pt ) type (F3D) pt flen = sqrt( pt%x**2 + pt%y**2 + pt%z**2 ) return end function end module structmodule |
Fortranの構造体は TYPE で定義して、メンバ変数には「%」を使って参照する。
構造体はC言語側でもう一度定義しないさないといけない。
1 2 3 4 5 6 7 | // 構造体を呼び出す extern "C" { struct F3D { double x,y,z ; }; double STRUCTMODULE_mp_FLEN( struct F3D *pt ); } |
型だけを合わせれば OK で、メンバ変数名は自由につけてよい…が、同じようにつけたほうが良かろう。
関数の引き数に使う場合は、integerの変数と同じようにポインタにする。
function の戻り値に構造体を使うことも可能だと思うのだが、メモリ関係がややこしくなりそうなので構造体のデータ受け渡しは、引数で行ったほうが無難。