12 Stimmen

Arrays von Strings in Fortran-C-Brücken mit iso_c_binding

Ich schreibe Code, der eine C-Funktion von Fortran aus aufruft und dabei den C-Interoperabilitätsmechanismus von Fortran verwendet (eingeführt in Fortran 2003 und implementiert in neueren Versionen von gfortran und ifort).

Diese Antwort ist fast das, was ich brauche, aber ich komme nicht ganz dahinter, welche Schnittstellendeklaration ich in Fortran für eine C-Funktion verwenden sollte, die so aussieht:

int use_array(int n, char * array[]){
    int i;
    for(i=0; i<n; i++){
        printf("Item %d = %s\n",i,array[i]);
    }
    return n;
}

Mir ist nicht klar, wie die Deklaration für die Schnittstelle auf der Fortran-Seite aussehen soll:

interface
    function use_array(n, x) bind(C)
        use iso_c_binding
        integer (c_int) use_array
        integer (c_int), value :: n
        character(c_char) WHAT_SHOULD_GO_HERE? :: x
    end function use_array
end interface

Ich weiß, dass ich mich auch mit dem Problem der Nullterminierung auseinandersetzen muss.

10voto

tpg2114 Punkte 13344

Wir verwenden dazu eine C_PTR Array auf Zeichenketten verweisen. Zum Beispiel:

CHARACTER(LEN=100), DIMENSION(numStrings), TARGET :: stringArray
TYPE(C_PTR), DIMENSION(numStrings) :: stringPtrs

dann setzen wir unsere Zeichenketten in stringArray und denken Sie daran, sie mit Null abzuschließen, z. B.:

DO ns = 1, numStrings
   stringArray(ns) = "My String"//C_NULL_CHAR
   stringPtrs(ns) = C_LOC(stringArray(ns))
END DO

und passieren stringPtrs an die C-Funktion.

Die C-Funktion hat die Schnittstelle:

void stringFunc(int *numStrings, char **stringArray) {
    int i;
    for(i=0;i<*numStrings;++i) {
       printf("%s\n",stringArray[i]);
    }
 }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X