爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 6913|回复: 7

[混合编程] 【转】c语言和fortran的混合编程

[复制链接]

新浪微博达人勋

0
早起挑战累计收入
发表于 2011-7-30 18:32:23 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
还没有去测试,先转过来,需要的可以试试
===============================
C/C++采用的是缺省调用约定是STDCALL约定.C程序中,可以在函数原型的声明中使用_stdcall关键字来指明过程采用STDCALL调用约定。
Fortran过程采用的缺省标识符是,全部大写的过程名加上“_”前缀和“@n”后缀。在C程序中保留标识符的大小写。编译程序会给采用STDCALL约定的过程标识符加上“_”前缀和“@n”后缀。
Fortran过程缺省的参数传递方式是引用方式是。对于下面这个Fortarn过程:
   SUBROUTINE ForSub(ivar,rvar)
      INTEGER ivar
      REAL rvar
      WRITE(*,*) ivar,rvar
   END
C语言程序中应给出过程的函数原型及调用方式为:
   void main()
{
extern void__stdcall FORSUB(int*I,float*f);
int iCVAR=1;
float rCVAR=2.0;
FORSUB(&iCVAR,&rCVAR);
}
C++中调用Fortan的过程,在声明函数原型时需要用externC”语句,以避免C++编译程序对标识符的修饰;并且C++也可以通过引用方式传递参数。对于上面的Fortran过程,C++程序应给出的函数原型及调用方法是:
   void main()
{
extern “C”{void__stdcall FORSUB(int*I,float*f);}
int iCVAR=1;
float rCVAR=2.0;
FORSUB(&iCVAR,&rCVAR);
}
另外,也可以在Fortran中用!MS$ATTRIBUTES编译伪指令来改变Fortran子过程的调用约定,以便于被其他语言的程序调用。在下面的例子中,过程ForSub具有C语言的调用约定。
SUBROUTINE ForSub(ivar,rvar)
      !MS$ATTRIBUTES C::ForSub
INTEGER ivar
      REAL rvar
      WRITE(*,*) ivar,rvar
   END
这样,这个过程使用的是C调用约定,并且参数传递方式也变为传值方式,过程的标识符变为全部小写且有_前缀而无后缀的方式。在C语言源程序中的函数原型及调用方法为:
  void main()
{
extern void FORSUB(int ivar,float rvar);
int iVar=1;
float fVar=2.0;
FORSUB(iVar,fVar);
}
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2011-8-1 12:48:27 | 显示全部楼层
还没有用到混合编程,先顶起来啦
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2011-8-26 15:12:11 | 显示全部楼层
本帖最后由 zdhai 于 2011-8-26 15:13 编辑

楼主转的是个“C语言中调用fortran”,我来转一个《FORTRAN对C/C++函数的调用》,配个姊妹篇,嘿嘿~~
==============================================================================
Fortran对C/C++函数的调用具有很重要的实际意义。全部的Windows API函数都是用C语言编写的。要利用Windows所提供的一些系统功能,如编写多线程程序,进行复杂的文件操作等,不可避免地要使用Windows API函数,这时就存在调用C语言的函数的问题。另外在一些其他的场合,调用C/C++函数也是十分重要的。
Fortran调用一般的C函数首先要在声明函数接口的时候要用C属性指出函数采用的是C调用约定。C属性使函数的标识符全部变为小写,这时还要使用ALIAS属性指定函数的标识符。最后还要显示的指出参数传递方式。
例如下面的一个C函数:
   int Fact(int n)
   {
if(n>1)
return(n*Fact(n-1));
return 1;
}
调用它的Fortran主程序为:
PROGRAM MAIN
INTERFACE
     INTEGER(4) FUNCTION Fact(n)
     !MS $ ATTRIBUTES C,ALIAS: ’Fact’ ::Fact
         INTEGER(4) n
!MS $ ATTRIBUTES VALUE :: n
END FUNCTION
END INTERFACE
IUNTEGER(4) N
N=10
WRITE(*,*)’FACTIONAL OF’,N,’IS’,Fact(N)
END
但是,如果上面的函数Fact是在C++程序中定义的,那么如果要在Fortran中对它进行调用,Fact的定义是必须写为下面的形式才能为Fortran程序调用。
Extern “C” int Fact(int n)
{
  if(n>1)
    return(n*Fact(n-1));
return 1;
}
Windows API函数虽然是用C语言编写的。但是它采用的调用约定为STDCALL约定,这一点需要注意。另外读者可以参考FORTRAN POWERSTATION 为实现Windows API接口而提供的模块的源程序,如msfwin.f90,mt.f90。

评分

参与人数 1金钱 +10 贡献 +3 收起 理由
mofangbao + 10 + 3 不错 谢谢分享

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2011-8-26 15:38:36 | 显示全部楼层
我有这方面的系统教程,过几天发!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
 楼主| 发表于 2011-8-26 15:57:25 | 显示全部楼层
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2011-8-28 00:40:08 | 显示全部楼层
今天上了一本关于这方面的教材!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2011-9-28 09:26:49 | 显示全部楼层
athlon8048 发表于 2011-8-28 00:40
今天上了一本关于这方面的教材!

哪儿下载??
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-10-28 10:33:08 | 显示全部楼层
多学学,谢楼主
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

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