我在将char数组从C++传递到fortran(f90)时遇到了问题。将字符数组从C++传递到fortran
这里是我的C++文件, 'cmain.cxx':
这里是我的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 '
与大小3中声明 'cmain.cxx' 的字符阵列,即:
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的字符数组,这意味着终止'\ 0'丢失,并导致'abcxyz'输出 - 这是我的预期应用程序不可接受的。
任何帮助将不胜感激,这是让我疯了!
我没有看到您正在使用Fortran的'与C的互操作性'功能,旨在缓解您面临的这些问题。我建议你使用它们。 – 2012-04-15 16:22:27
嗨,马克,我有一个外部提供的fortran程序,我希望通过C++进行接口。我无法修改Fortran代码。你能否看到一种方法让这个工作不需要修改原始的fortran文件? – user1334640 2012-04-15 16:34:24
这取决于您正在进行的接口连接的实际类型,但是如果您拥有Fortran代码,即使无法更改它,也可以向其添加C接口模块。这个模块只会让一些转换函数对C可见。作为奖励,您可以去掉函数名称中的尾部_。 – 2012-04-15 17:47:12