передача массивов символов из с ++ в фортран
У меня проблемы с передачей массивов символов из c ++ в fortran (f90).
Вот мой файл c ++, «cmain.cxx»:
<code>#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; } </code>
Вот мой файл на Фортране, 'ftest.f90':
<code>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 </code>
Процесс сборки:
<code>gfortran -c -m64 ftest.f90 g++ -c cmain.cxx gfortran -m64 -lstdc++ -gnofor_main -o test ftest.o cmain.o </code>
Редактировать: обратите внимание, что исполняемый файл также может быть собран через:
<code>g++ -lgfortran -o test ftest.o cmain.o </code>
Кроме того, флаг -m64 необходим, поскольку я использую OSX 10.6.
Выходные данные выполнения «теста» является:
<code>c++: string[0] = 'abc' c++: string[1] = 'xyz' fortran: string(1) = 'abc' 'abc' equals 'abc' fortran: string(2) = 'xy' 'xy' does not equal 'xyz' </code>
Объявление «строки» и «ожидаемый»; массивы символов в ftest.f90 размером 4, то есть:
<code>CHARACTER*4 string(2) CHARACTER*4 expected(2) </code>
и перекомпиляция дает следующий вывод:
<code>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 ' </code>
Объявление массивов символов в «cmain.cxx»; с размером 3, то есть:
<code>extern "C" int ftest_( char (*string)[3] ); int main() { char string[2][3]; </code>
и возврат к исходному размеру в файле fortran (3), то есть:
<code>CHARACTER*3 string(2) CHARACTER*3 expected(2) </code>
и перекомпиляция дает следующий вывод:
<code>c++: string[0] = 'abcxyz' c++: string[1] = 'xyz' fortran: string(1) = 'abc' 'abc' equals 'abc' fortran: string(2) = 'xyz' 'xyz' equals 'xyz' </code>
Таким образом, последний случай - единственный, который работает, но здесь я назначил 3 символа массиву символов размера 3, что означает завершающий символ \ 0; отсутствует и приводит к «abcxyz»; вывод - это не приемлемо для моего предполагаемого применения.
Любая помощь будет принята с благодарностью, это сводит меня с ума!