Fortran Coder

查看: 9266|回复: 4
打印 上一主题 下一主题

[混编] Fortran调用C返回实数数组问题

[复制链接]

24

帖子

7

主题

0

精华

熟手

F 币
132 元
贡献
80 点
跳转到指定楼层
楼主
发表于 2017-5-7 22:26:35 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
您好,请教一个Fortran调用C返回实数数组问题。之前群主在论坛里写的一个Fortran调用C返回一个数的例题,我想问问,如何返回一个数组呢?在群主之前的例题上修改了一点,结果还是有问题。我只是想实现在对数组中每个元素加1的结果再返回到Fortran中来,结果是只实现了第一个元素加1,别的不行
C程序:
[C] 纯文本查看 复制代码
01#include <stdlib.h>
02#include <stdio.h>
03#include <string.h>
04double c_add(double a[], int n)
05{
06int i;
07double s=0;
08double *xx ;
09xx = calloc(n,sizeof(double));
10for(i=0;i<n;++i)
11xx=a+1;
12printf("n/", xx );
13return *xx;
14}

Fortran程序:
[Fortran] 纯文本查看 复制代码
01module interfaces
02interface
03real(8) function add(a,n) Bind( C , Name = "c_add" )
04  use ,Intrinsic::ISO_C_Binding
05  type(C_PTR) , value :: a
06  integer , value :: n
07end function add
08end interface
09end module interfaces
10 
11program main
12  use interfaces
13  use , intrinsic :: ISO_C_Binding
14  implicit none
15  integer::i;
16  real(8) , target :: x(5) = [0.1,0.2,0.3,0.4,0.5]
17  do i=1,size(x)
18  write(*,*)  add( c_loc(x) , size(x) )
19  end do
20end program main
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

24

帖子

7

主题

0

精华

熟手

F 币
132 元
贡献
80 点
5#
 楼主| 发表于 2017-5-8 09:22:52 | 只看该作者
pasuka 发表于 2017-5-8 09:07
改成传递函数指针
参看,(没有C和C++基础的话,多花点功夫,两个月时间应该能搞明白)
The GNU Fortran Co ...

嗯嗯,我再看看

24

帖子

7

主题

0

精华

熟手

F 币
132 元
贡献
80 点
地板
 楼主| 发表于 2017-5-8 09:22:33 | 只看该作者
fcode 发表于 2017-5-7 22:43
混编时,请尽量遵循以下原则:
谁申请,谁释放;谁打开,谁关闭;谁构造,谁析构。

好的,我试试,谢谢啦

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

板凳
发表于 2017-5-8 09:07:40 | 只看该作者
本帖最后由 pasuka 于 2017-5-8 09:09 编辑

改成传递函数指针
参看,(没有C和C++基础的话,多花点功夫,两个月时间应该能搞明白)
The GNU Fortran Compiler: Working with Pointers
https://gcc.gnu.org/onlinedocs/g ... rking-with-Pointers

2038

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1676 元
贡献
715 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2017-5-7 22:43:22 | 只看该作者
混编时,请尽量遵循以下原则:
谁申请,谁释放;谁打开,谁关闭;谁构造,谁析构。

因此,你这样在C里面calloc一个数组,返回给fortran。先不管行不行得通,这样做非常容易导致内存泄漏(因为没法释放)

所以,最佳的方法是:由fortran定义(或分配)数组,传递给C语言,C语言对其赋值。然后fortran获得对应的赋值并继续使用。最终由定义者(或分配者)也就是fortran来释放。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2025-5-2 18:00

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

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