Fortran Coder

查看: 13958|回复: 10
打印 上一主题 下一主题

[混编] 如何实现Fortran和C++/C混合编程?

[复制链接]

62

帖子

14

主题

0

精华

专家

F 币
557 元
贡献
326 点
跳转到指定楼层
楼主
发表于 2014-11-19 14:57:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 安靖 于 2014-11-19 15:44 编辑

想要fortran和C++/C混合编程,C++/C编译成静态库,然后fortran调用。用一个简单的例子来说明

c++文件
sum.cpp
[] 纯文本查看 复制代码
int sum_fun(int &n, double num[], double &sum)
{
       int i;
       sum = 0.0;
       for(i = 0; i < n; i++)
       { 
               sum += num[i];
        }
        return 0;
}

fortran文件
main.f90
[Fortran] 纯文本查看 复制代码
program main
     implicit none
     integer :: n
     real :: a
     real, allocatable, dimension(:) :: num
     n = 4
     allocate( num(n) )
    num = 1.0;
    call sum_fun(n, num, a)
     write(*,*) "The sum is ', a
end program


cpp生成静态库
g++ -c sum.cpp
ar -cr libsum.a sum.o
生成可执行程序
ifort -c main.f90
ifort -o main.o -L./ -lsum -lstdc++


大致的思路如上,但是存在问题。请大家帮我看看哪里不对

分享到:  微信微信
收藏收藏2 点赞点赞 点踩点踩

60

帖子

17

主题

0

精华

专家

F 币
454 元
贡献
266 点
沙发
发表于 2014-11-19 16:27:52 | 只看该作者
混编完全不会,但是看了代码觉得楼主有个很明显的问题,C++的数组是从0开始,而fortran的数组是从1开始,貌似不能像楼主那么玩吧?还有,fortran在传递动态数组的时候貌似需要interface的吧。
菜鸟意见,坐等大神回答。

62

帖子

14

主题

0

精华

专家

F 币
557 元
贡献
326 点
板凳
 楼主| 发表于 2014-11-19 16:31:49 | 只看该作者
本帖最后由 安靖 于 2014-11-19 16:54 编辑

自己搞定了,改成这样就行了。。

c++文件
sum.cpp
[] 纯文本查看 复制代码
#indef __cplusplus
      extern "C"{
      int sum_fun_(int &, double *, double &);
}#endif

int sum_fun_(int &n, double num[], double &sum)
{
       int i;
       sum = 0.0;
       for(i = 0; i < n; i++)
       { 
               sum += num;
        }
        return 0;
}

fortran文件
main.f90
[Fortran] 纯文本查看 复制代码
program main
     implicit none
     integer :: n
     real :: a
     real, allocatable, dimension(:) :: num
     n = 4
     allocate( num(n) )
    num = 1.0;
    call sum_fun(n, num, a)
     write(*,*) "The sum is ', a
end program


cpp生成静态库
g++ -c sum.cpp
ar -cr libsum.a sum.o
生成可执行程序
ifort -c -r8 -main.f90
ifort -o test main.o -L./ -lsum -lstdc++



712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

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

地板
发表于 2014-11-19 19:30:11 | 只看该作者
这是没加类,加上类的话,Fortran 调用 C++ 就很难搞了。反之 C++ 调用 Fortran 就容易多了。

62

帖子

14

主题

0

精华

专家

F 币
557 元
贡献
326 点
5#
 楼主| 发表于 2014-11-19 22:26:23 | 只看该作者
楚香饭 发表于 2014-11-19 19:30
这是没加类,加上类的话,Fortran 调用 C++ 就很难搞了。反之 C++ 调用 Fortran 就容易多了。 ...

是的,暂时先不加类试下。
下一步就是想试着加类混编下。

用c写个接口,封装下c++,把面向对象又变成面向过程。
你有没有搞过类似的工作的。 Fortran调用C++类?

62

帖子

14

主题

0

精华

专家

F 币
557 元
贡献
326 点
6#
 楼主| 发表于 2014-11-19 22:26:48 | 只看该作者
楚香饭 发表于 2014-11-19 19:30
这是没加类,加上类的话,Fortran 调用 C++ 就很难搞了。反之 C++ 调用 Fortran 就容易多了。 ...

是的,暂时先不加类试下。
下一步就是想试着加类混编下。

用c写个接口,封装下c++,把面向对象又变成面向过程。
你有没有搞过类似的工作的。 Fortran调用C++类?

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

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

7#
发表于 2014-11-20 07:29:37 | 只看该作者
我只搞过 Fortran 调用 C。
C/C++ 部分是其他同事搞的,也只能是写成 C 的接口。

6

帖子

2

主题

0

精华

入门

F 币
59 元
贡献
30 点
8#
发表于 2014-11-20 11:53:25 | 只看该作者
混合编程的话,最好是fortran调用c,如果是比较大型工程,fortran要加interface和iso-c-banding等来完成interface,目前用fortran90调用c的lib或dll,都比以前容易太多了。主要可以不考虑调用约定等问题了。可以参考netcdf的架构体系。

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

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

9#
发表于 2014-11-20 13:33:56 | 只看该作者
安靖 发表于 2014-11-19 22:26
是的,暂时先不加类试下。
下一步就是想试着加类混编下。

这样做岂不是以卵击石吗?
C++的好处是:面向对象、使用者多、参考资料多
Fortran的唯一好处是:简单易学,有大量历史遗留代码
用C封装C++的类,然后再让Fortran去调用,事倍功半
很多商业软件的做法只有2种:
1、用C、C++重写fortran部分代码;
2、封装fortran供C、C++调用

62

帖子

14

主题

0

精华

专家

F 币
557 元
贡献
326 点
10#
 楼主| 发表于 2014-11-22 10:21:42 | 只看该作者
addison 发表于 2014-11-20 11:53
混合编程的话,最好是fortran调用c,如果是比较大型工程,fortran要加interface和iso-c-banding等来完成int ...

netcdf架构? Network Common Data Form这个?
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-4-26 07:46

Powered by Tencent X3.4

© 2013-2024 Tencent

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