Pregunta

Estoy escribiendo el código que se llame a una función de C de Fortran usando Fortran C del mecanismo de interoperabilidad (introducido en Fortran 2003 e implementado en las versiones más recientes de gfortran y ifort).

Esta respuesta es casi lo que necesito, pero no puedo conseguir mi cabeza alrededor de lo que la interfaz de declaración que debo utilizar en Fortran para una función de C que se parece a esto:

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

No me queda claro lo que la declaración debe ser para la interfaz en el Fortran final:

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

Sé que me vas a tener que lidiar con el nulo de terminación de la edición también.

¿Fue útil?

Solución

La manera que tenemos de hacerlo es utilizar un C_PTR de la matriz de punto para las cadenas.Por ejemplo:

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

a continuación, establecemos nuestras cadenas en stringArray, recordando a terminar null ellos, tales como:

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

y de paso stringPtrs a la función de C.

La función de C tiene la interfaz:

void stringFunc(int *numStrings, char **stringArray) {
    int i;
    for(i=0;i<*numStrings;++i) {
       printf("%s\n",stringArray[i]);
    }
 }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top