Mam problemy z przekazywaniem tablic znaków od C++ do fortranu (f90).przechodzi przez tablice znaków od C++ do fortranu
Oto mój C++ plik 'cmain.cxx':
Oto moja Fortran plik '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
Proces kompilacji jest:
gfortran -c -m64 ftest.f90
g++ -c cmain.cxx
gfortran -m64 -lstdc++ -gnofor_main -o test ftest.o cmain.o
Edycja: zauważ, że plik wykonywalny można również zbudować za pomocą:
g++ -lgfortran -o test ftest.o cmain.o
Wymagana jest także flaga -m64, ponieważ korzystam z OSX 10.6.
Wyjście z wykonaniem 'test' jest:
c++: string[0] = 'abc'
c++: string[1] = 'xyz'
fortran: string(1) = 'abc'
'abc' equals 'abc'
fortran: string(2) = 'xy'
'xy' does not equal 'xyz'
Deklarowanie 'string' i 'Oczekiwano' tablice znaków w ftest.f90 o rozmiarze 4, a mianowicie:
CHARACTER*4 string(2)
CHARACTER*4 expected(2)
i rekompilacji daje następujący wynik:
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 '
deklarowania tablic znaków w 'cmain.cxx' o rozmiarze 3, tj:
extern "C" int ftest_(char (*string)[3]);
int main() {
char string[2][3];
i powraca do pierwotnego rozmiaru w pliku Fortran (3), tj:
CHARACTER*3 string(2)
CHARACTER*3 expected(2)
i rekompilacji daje następujący wynik:
c++: string[0] = 'abcxyz'
c++: string[1] = 'xyz'
fortran: string(1) = 'abc'
'abc' equals 'abc'
fortran: string(2) = 'xyz'
'xyz' equals 'xyz'
Więc ostatni przypadek jest tylko jeden, który działa, ale tutaj przypisałem 3 znaki do tablicy znaków o rozmiarze 3, co oznacza, że brakuje "\ 0" zakończenia i prowadzi do wyjścia "abcxyz" - jest to niedopuszczalne dla mojej zamierzonej aplikacji.
Każda pomoc będzie bardzo doceniona, to doprowadza mnie do szału!
Nie widzę żadnego znaku, że korzystasz z możliwości Interoperability with C firmy Fortran, które mają na celu złagodzenie takich problemów, z jakimi masz do czynienia. Sugeruję, żebyś z nich skorzystał. –
Cześć Mark, mam zewnętrznie dostarczony program fortranowy, z którym chcę się połączyć za pomocą C++. Nie mogę zmodyfikować kodu Fortran. Czy widzisz sposób, aby to zadziałało bez modyfikowania oryginalnego pliku Fortran? – user1334640
To zależy od faktycznego rodzaju interakcji, ale jeśli posiadasz kod Fortran, nawet jeśli nie możesz go zmienić, możesz dodać do niego moduł interfejsu C. Moduł po prostu uczyniłby niektóre funkcje konwersji widocznymi dla C. Jako bonus, możesz pozbyć się kończących _ w nazwach funkcji. –