文字列の受け渡しはなるべくしたくないのだが、設定やら名称取得やらで必要になってくる。
Fortran の場合は、NULL terminate ではないのでC++で扱うときにはちょっと厄介である…そういえば、stringクラスを使うことになるので、そのあたりも考えないと。
基本は、固定領域をとっておいて、あとからC++側でnullを付け加えるとok。
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++の関数では長さを定義する変数が入る。これは数値の変数とは違って、値型で渡す。
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 ); }
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) の相互変換スクリプト?