我正在编写代码,使用 Fortran 的 C 互操作性机制(在 Fortran 2003 中引入并在较新版本的 gfortran 和 ifort 中实现)调用 Fortran 中的 C 函数。

这个答案 几乎是我所需要的,但我不太清楚应该在 Fortran 中为如下所示的 C 函数使用什么接口声明:

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

我确实知道我也必须处理空终止问题。

有帮助吗?

解决方案

我们这样做的方法是使用 C_PTR 数组指向字符串。例如:

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

然后我们将字符串设置为 stringArray, ,记住以空终止它们,例如:

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]);
    }
 }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top