Question

Je suis en train d'écrire le code qui va appeler une fonction C de Fortran à l'aide de Fortran C interopérabilité mécanisme (introduit en Fortran 2003 et mis en œuvre dans les plus récentes versions de gfortran et ifort).

Cette réponse est à peu près ce dont j'ai besoin, mais je n'arrive pas à obtenir ma tête autour de ce que l'interface de déclaration que je devrais utiliser en Fortran pour une fonction C qui ressemble à ceci:

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

Je ne suis pas sûr que la déclaration devrait être de l'interface sur le Fortran fin:

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

Je sais que je vais avoir à traiter avec le null-résiliation question aussi.

Était-ce utile?

La solution

La façon dont nous le faire est d'utiliser un C_PTR tableau au point de chaînes de caractères.Par exemple:

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

ensuite, nous avons défini nos chaînes dans stringArray, en se souvenant de zéro à la fin de celles-ci, tels que:

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

et pass stringPtrs à la fonction C.

La fonction C a l'interface:

void stringFunc(int *numStrings, char **stringArray) {
    int i;
    for(i=0;i<*numStrings;++i) {
       printf("%s\n",stringArray[i]);
    }
 }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top