问题描述
我在写code,将调用来自Fortran语言使用Fortran内模块ISO_C_BINDING的C函数(在FORTRAN 2003年推出,并在gfortran和ifort的新版本中实现)。
I'm writing code that will call a C function from Fortran using the Fortran intrinsic module ISO_C_BINDING (introduced in fortran 2003 and implemented in newer versions of gfortran and ifort).
这答案几乎是我所需要的:
This answer is almost what I need: http://stackoverflow.com/a/7964302/989692
我不能完全得到我的头周围有什么接口声明,我应该用Fortran使用C函数,看起来像这样:
I can't quite get my head around what interface declaration I should use in Fortran for a C function that looks like this:
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接口:
I'm not clear what the declaration should be for the interface on the Fortran end:
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
我知道我必须要处理的空终止的问题了。
非常感谢。
I do know that I'll have to deal with the null-termination issue too.Many thanks.
推荐答案
我们做的是使用 C_PTR
阵列指向字符串的方式。例如:
The way we do it is to use a C_PTR
array to point to strings. For example:
CHARACTER(LEN=100), DIMENSION(numStrings), TARGET :: stringArray
TYPE(C_PTR), DIMENSION(numStrings) :: stringPtrs
然后我们设定中的字符串字符串数组
,记住空终止它们,例如:
then we set our strings in stringArray
, remembering to null-terminate them such as:
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]);
}
}
这篇关于用FORTRAN ISO_C_BINDING-C桥梁字符串数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!