文字列の受け渡しはなるべくしたくないのだが、設定やら名称取得やらで必要になってくる。
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) の相互変換スクリプト?