我在将 char 数组从 c++ 传递到 fortran (f90) 时遇到问题。
这是我的 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 标志。
执行“测试”的输出是:
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 中声明大小为 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 个字符分配给大小为 3 的 char 数组,这意味着缺少终止的 '\0',并导致输出 'abcxyz' - 这是不可接受的我的预期应用。
任何帮助将不胜感激,这让我发疯!