Domanda

Sto scrivendo il codice che chiamerà una funzione C da Fortran utilizzando il meccanismo di interoperabilità di Fortran (introdotto a Fortran 2003 e implementato nelle versioni più recenti di Gfortran e Ifort).

Questa risposta è quasi quello di cui ho bisogno, ma non riesco a ottenere il mio capo su quale dichiarazione di interfaccia dovreiUtilizzare in Fortran per una funzione C Sembra questo:

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;
}
.

Non sono chiaro cosa dovrebbe essere la dichiarazione per l'interfaccia sull'estremità Fortran:

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
.

Lo so che dovrò affrontare anche il problema di terminazione nulla.

È stato utile?

Soluzione

Il modo in cui facciamo è usare un'array C_PTR per puntare a stringhe.Ad esempio:

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

Poi sistemiamo le nostre stringhe in stringArray, ricordando di null-terminali come:

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

e pass stringPtrs alla funzione C.

La funzione C ha l'interfaccia:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top