c++ から fortran (f90) に char 配列を渡すのに問題があります。
これが私の C++ ファイル 'cmain.cxx' です。
#include <iostream>
using namespace std;
extern "C" int ftest_( char (*string)[4] );
int main() {
char string[2][4];
strcpy(string[0],"abc");
strcpy(string[1],"xyz");
cout << "c++: string[0] = '" << string[0] << "'" << endl;
cout << "c++: string[1] = '" << string[1] << "'" << endl;
ftest_(string);
return 0;
}
これが私の fortran ファイル 'ftest.f90' です。
SUBROUTINE FTEST(string)
CHARACTER*3 string(2)
CHARACTER*3 expected(2)
data expected(1)/'abc'/
data expected(2)/'xyz'/
DO i=1,2
WRITE(6,10) i,string(i)
10 FORMAT("fortran: string(",i1,") = '", a, "'" )
IF(string(i).eq.expected(i)) THEN
WRITE(6,20) string(i),expected(i)
20 FORMAT("'",a,"' equals '",a,"'")
ELSE
WRITE(6,30) string(i),expected(i)
30 FORMAT("'",a,"' does not equal '",a,"'")
END IF
ENDDO
RETURN
END
ビルド プロセスは次のとおりです。
gfortran -c -m64 ftest.f90
g++ -c cmain.cxx
gfortran -m64 -lstdc++ -gnofor_main -o test ftest.o cmain.o
編集:実行可能ファイルは次の方法でもビルドできることに注意してください:
g++ -lgfortran -o test ftest.o cmain.o
また、OSX 10.6 を実行しているため、-m64 フラグが必要です。
「test」の実行による出力は次のとおりです。
c++: string[0] = 'abc'
c++: string[1] = 'xyz'
fortran: string(1) = 'abc'
'abc' equals 'abc'
fortran: string(2) = 'xy'
'xy' does not equal 'xyz'
ftest.f90 で 'string' および 'expected' 文字配列をサイズ 4 で宣言します。つまり、次のようになります。
CHARACTER*4 string(2)
CHARACTER*4 expected(2)
再コンパイルすると、次の出力が得られます。
c++: string[0] = 'abc'
c++: string[1] = 'xyz'
fortran: string(1) = 'abc'
'abc' does not equal 'abc '
fortran: string(2) = 'xyz'
'xyz' does not equal 'xyz '
'cmain.cxx' でサイズ 3 の文字配列を宣言します。
extern "C" int ftest_( char (*string)[3] );
int main() {
char string[2][3];
Fortran ファイル (3) の元のサイズに戻します。つまり、次のようになります。
CHARACTER*3 string(2)
CHARACTER*3 expected(2)
再コンパイルすると、次の出力が得られます。
c++: string[0] = 'abcxyz'
c++: string[1] = 'xyz'
fortran: string(1) = 'abc'
'abc' equals 'abc'
fortran: string(2) = 'xyz'
'xyz' equals 'xyz'
したがって、最後のケースのみが機能しますが、ここではサイズ 3 の char 配列に 3 文字を割り当てました。これは、終端の '\0' が欠落していることを意味し、'abcxyz' 出力につながります。私の意図したアプリケーション。
どんな助けでも大歓迎です、これは私を夢中にさせています!