FortranにC++から文字列を渡す

文字列の受け渡しはなるべくしたくないのだが、設定やら名称取得やらで必要になってくる。
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++側に仕込むのがよかろう。

カテゴリー: 開発, C++, Fortran パーマリンク

FortranにC++から文字列を渡す への1件のコメント

  1. masuda のコメント:

    あとは、
    – FortranでWrite/Readの方法
    – string の自動変換?
    – 構造体(TYPE, struct) の相互変換スクリプト?

コメントは停止中です。