передача массивов символов из c++ в фортран

У меня проблемы с передачей массивов символов из c++ в фортран (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;
}

Вот мой файл на фортране, '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

Кроме того, требуется флаг -m64, так как я использую OSX 10.6.

Результатом выполнения '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'

Объявление массивов символов 'string' и 'expected' в файле 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];

и возвращением к исходному размеру в файле фортрана (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» -, это неприемлемо для моего предполагаемого приложения.

Будем признательны за любую помощь, это сводит меня с ума!

6
задан user1334640 15 April 2012 в 16:14
поделиться