Pergunta

Estou escrevendo um código que chamará uma função C do Fortran usando o mecanismo de interoperabilidade C do Fortran (introduzido no Fortran 2003 e implementado em versões mais recentes do gfortran e do ifort).

Esta resposta é quase o que eu preciso, mas não consigo entender qual declaração de interface devo usar no Fortran para uma função C parecida com esta:

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

Não estou claro qual deve ser a declaração para a interface no final do 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

Eu sei que também terei que lidar com o problema da rescisão nula.

Foi útil?

Solução

A maneira como fazemos isso é usar um C_PTR array para apontar para strings.Por exemplo:

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

então colocamos nossas cordas stringArray, lembrando de encerrá-los com nulo, como:

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

e passar stringPtrs para a função C.

A função C tem a interface:

void stringFunc(int *numStrings, char **stringArray) {
    int i;
    for(i=0;i<*numStrings;++i) {
       printf("%s\n",stringArray[i]);
    }
 }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top