Übergabe von char-Arrays von c ++ an fortran

Ich habe Probleme beim Übergeben von Zeichen-Arrays von c ++ an fortran (f90).

Hier ist meine C ++ - Datei '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>

Hier ist meine fortran-Datei '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>

Der Erstellungsprozess ist:

<code>gfortran -c -m64   ftest.f90 
g++ -c  cmain.cxx
gfortran -m64 -lstdc++ -gnofor_main -o test ftest.o cmain.o
</code>

Bearbeiten: Beachten Sie, dass die ausführbare Datei auch erstellt werden kann über:

<code>g++ -lgfortran -o test ftest.o cmain.o
</code>

Außerdem ist das Flag -m64 erforderlich, da OSX 10.6 ausgeführt wird.

Die Ausgabe von 'test' ist:

<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>

Deklarieren der Arrays 'string' und 'expected' in ftest.f90 mit der Größe 4, dh:

<code>CHARACTER*4 string(2)
CHARACTER*4 expected(2)
</code>

und Neukompilieren ergibt die folgende Ausgabe:

<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>

Deklarieren der Zeichenarrays in 'cmain.cxx' mit der Größe 3, dh:

<code>extern "C" int ftest_( char (*string)[3] );

int main() {
    char string[2][3];
</code>

und Zurücksetzen auf die ursprüngliche Größe in der fortran-Datei (3), dh:

<code>CHARACTER*3 string(2)
CHARACTER*3 expected(2)
</code>

und Neukompilieren ergibt die folgende Ausgabe:

<code>c++: string[0] = 'abcxyz'
c++: string[1] = 'xyz'
fortran: string(1) = 'abc'
'abc' equals 'abc'
fortran: string(2) = 'xyz'
'xyz' equals 'xyz'
</code>

Der letzte Fall ist also der einzige, der funktioniert, aber hier habe ich einem Zeichenarray der Größe 3 3 Zeichen zugewiesen, was bedeutet, dass die abschließende '\ 0' fehlt und zur Ausgabe 'abcxyz' führt - dies ist für nicht akzeptabel meine beabsichtigte Anwendung.

Jede Hilfe wäre sehr dankbar, das macht mich verrückt!

Antworten auf die Frage(3)

Ihre Antwort auf die Frage