Fortran Coder

查看: 12401|回复: 6
打印 上一主题 下一主题

[混编] 从C传递数组到Fortran

[复制链接]

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

楼主
发表于 2014-3-13 00:43:40 | 显示全部楼层
本帖最后由 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;
}

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

沙发
发表于 2014-3-13 12:08:30 | 显示全部楼层
楼上说得很对,谁申请,谁释放;谁打开,谁关闭。这样才不容易出错。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-14 07:43

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表