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

我正在编写将使用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; } 

我不清楚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设置我们的字符串,记住以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]); } }