12

Fortran の C 相互運用メカニズム (Fortran 2003 で導入され、gfortran と ifort の新しいバージョンで実装されています) を使用して、Fortran から C 関数を呼び出すコードを書いています。

この答えはほとんど私が必要としているものですが、次のような C 関数に対して Fortran でどのインターフェイス宣言を使用する必要があるのか​​ について、頭がよくわかりません。

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

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

null 終了の問題にも対処しなければならないことはわかっています。

4

1 に答える 1

10

その方法は、C_PTR配列を使用して文字列を指すことです。例えば:

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

次に、文字列を に設定しstringArray、次のように null で終了することを忘れないでください。

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

stringPtrsそしてC関数に渡します。

C 関数には次のインターフェイスがあります。

void stringFunc(int *numStrings, char **stringArray) {
    int i;
    for(i=0;i<*numStrings;++i) {
       printf("%s\n",stringArray[i]);
    }
 }
于 2012-03-13T15:09:38.723 に答える