我正在编写将使用Fortran的C互操作性机制从Fortran调用C函数的代码(在Fortran 2003中引入并在较新版本的gfortran和ifort中实现)。
This answer几乎就是我所需要的,但是我不能完全了解我应该在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
我知道我也必须处理空终止问题。
答案 0 :(得分:10)
我们这样做的方法是使用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]);
}
}