本帖最后由 chuxf 于 2014-3-13 01:16 编辑
我把 float *a 改成 float **a 以后就可以正常运行了。
因为平时用 Binding 模块少,不太清楚具体如何规定。但是跟踪调试发现,c_ptr 实际上是一个有一个指针成员的结构体,因为 Fortran 传递是传址的。所以指针的地址,就是指针的指针。故而,c 里面应该用 float **a
仅站在 C 语言的角度,如果函数内分配空间,传递给调用者,也必须用指针的指针。
第二个程序用function就正常。那是因为fortran对返回值并不做任何处理,返回什么,就当什么。
d_array 中 a 是指针,返回Fortran以后,它依然是指针,于是 c_array 指针指向正确。
总结来说,Fortran调用一个函数,给它一个参数,一定是参数的地址(传址)。而被调用者返还的返回值,则不做处理。
[C] 纯文本查看 复制代码 void dynamic_array(int n1, float **a, int *n2)
{
int i;
// allocate array
*a = (float*)malloc(n1 * 2 * sizeof(float));
// set values of array
for (i = 0; i<n1 * 2; i++){ (*a)[i] = (float)i*i + 1.0; }
//print_float_array(a,n1*2);
// set length of array
*n2 = 20;
} |