使用iso_c_binding在Fortran-C桥中的字符串数组

Joe*_*ntz 12 c interop fortran fortran-iso-c-binding

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

这个答案几乎就是我所需要的,但是我不能完全理解我应该在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;
}
Run Code Online (Sandbox Code Playgroud)

我不清楚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
Run Code Online (Sandbox Code Playgroud)

我知道我也必须处理空终止问题.

tpg*_*114 10

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

CHARACTER(LEN=100), DIMENSION(numStrings), TARGET :: stringArray
TYPE(C_PTR), DIMENSION(numStrings) :: stringPtrs
Run Code Online (Sandbox Code Playgroud)

然后我们设置我们的字符串stringArray,记住null终止它们,例如:

DO ns = 1, numStrings
   stringArray(ns) = "My String"//C_NULL_CHAR
   stringPtrs(ns) = C_LOC(stringArray(ns))
END DO
Run Code Online (Sandbox Code Playgroud)

并传递stringPtrs给C函数.

C函数有接口:

void stringFunc(int *numStrings, char **stringArray) {
    int i;
    for(i=0;i<*numStrings;++i) {
       printf("%s\n",stringArray[i]);
    }
 }
Run Code Online (Sandbox Code Playgroud)

  • 这不是标准的Fortran 2003(请参见15.2.1节)或2008(请参见15.3.2节):**如果类型是字符,则且仅当其值为1时,长度类型参数才可互操作。**。gfortran将此信号(将* character(len = ...)*与C_LOC一起使用)表示为错误。在GCC bugzilla中,也有关于此问题的[讨论](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36759)。 (2认同)