文字列の受け渡しはなるべくしたくないのだが、設定やら名称取得やらで必要になってくる。
Fortran の場合は、NULL terminate ではないのでC++で扱うときにはちょっと厄介である…そういえば、stringクラスを使うことになるので、そのあたりも考えないと。
基本は、固定領域をとっておいて、あとからC++側でnullを付け加えるとok。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | module structmodule implicit none contains ! 文字列を受け取る subroutine fstr1( s ) character*20 s print *, 'in fstr1:[', s,']' end subroutine fstr1 ! 文字列を渡す subroutine fstr2( s ) character*20 s integer i ! * で埋める do i=1,10 s(i:i) = '*' end do end subroutine fstr2 ! 文字列を渡す subroutine fstr3( s ) character*20 :: s s = 't.masuda' end subroutine fstr3 end module structmodule |
文字列を引数にすると、C++の関数では長さを定義する変数が入る。これは数値の変数とは違って、値型で渡す。
1 2 3 4 5 6 7 | extern "C" { // 文字列を渡す void STRUCTMODULE_mp_FSTR1( char *str, int count ); // 文字列を受け取る void STRUCTMODULE_mp_FSTR2( char *str, int count ); void STRUCTMODULE_mp_FSTR3( char *str, int count ); } |
1 2 3 4 5 6 7 8 9 10 11 | char str1[20+1] = {0}; strcpy( str1, "t.masuda" ); STRUCTMODULE_mp_FSTR1( str1, sizeof (str1)-1); char str2[20+1] = {0}; STRUCTMODULE_mp_FSTR2( str2, sizeof (str2)-1); cout << "str2:[" << str2 << "]" << endl; char str3[20+1] = {0}; STRUCTMODULE_mp_FSTR3( str3, sizeof (str3)-1); cout << "str3:[" << str3 << "]" << endl; |
戻り値で扱うことができるかは不明。引数で渡すほうが無難だろう。
string型との変換を考えると、適当なマクロをC++側に仕込むのがよかろう。
あとは、
– FortranでWrite/Readの方法
– string の自動変換?
– 構造体(TYPE, struct) の相互変換スクリプト?