I am unable to pass char arrays from C ++ to fortran (f90).
Here is my C ++ file, '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; }
Here is my fortran file, '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
Build process:
gfortran -c -m64 ftest.f90 g++ -c cmain.cxx gfortran -m64 -lstdc++ -gnofor_main -o test ftest.o cmain.o
Edit: note that the executable can also be created with:
g++ -lgfortran -o test ftest.o cmain.o
Also, the -m64 flag is required since I am running OSX 10.6.
The result of executing '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'
Declaring arrays of characters 'string' and 'expected' in ftest.f90 with a size of 4, i.e.:
CHARACTER*4 string(2) CHARACTER*4 expected(2)
and recompiling gives the following result:
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 '
Declaring character arrays in 'cmain.cxx' with size 3, that is:
extern "C" int ftest_( char (*string)[3] ); int main() { char string[2][3];
and return to the original size in the fortran (3) file, that is:
CHARACTER*3 string(2) CHARACTER*3 expected(2)
and recompiling gives the following result:
c++: string[0] = 'abcxyz' c++: string[1] = 'xyz' fortran: string(1) = 'abc' 'abc' equals 'abc' fortran: string(2) = 'xyz' 'xyz' equals 'xyz'
So, the last case is the only one that works, but here I assigned 3 characters to a char array of size 3, which means that the termination "\ 0" is missing, and leads to the output of "abcxyz" - this is not acceptable for my intended application.
Any help would be greatly appreciated, it drives me crazy!