通过与Fortran 混合编译在C 中实现动态数组.docVIP

通过与Fortran 混合编译在C 中实现动态数组.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
通过与Fortran 混合编译在C 中实现动态数组

通过与Fortran 混合编译在C 中实现动态数组   摘要:动态数组在数据处理时有着独特的优势,Fortran语言数组功能强大并支持动态数组,而C语言不支持动态数组。利用Fortran与C/C++的混合编译思想,通过调用Fortran90例程的方法,在C中实现动态数组并给出了程序代码。   关键词:动态数组;Fortran;C/C++;混合编译;调用约定   中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)18-4192-03   数组是处理大量数据时的有力助手。在不能够事先确定数组大小的情况下,为避免数据溢出或越界,就要足够大的数组。这种方法使用过度,会迟滞内存操作。故此,理想的数组能够动态确定大小,即程序运行中先向系统申请一个大数组,不使用时再将其内存空间释放掉。而动态数组很好地满足了这一要求。但C语言不支持动态数组,不能动态定义数组元素的数量。如何解决这一矛盾将是本文的着力点。   1 Fortran中的动态数组   Fortran90数组功能强大,执行程序时能够动态分配数组存储空间和实际大小,不使用时再将其内存释放还给系统;支持直接操作数组段、数组整体;支持逐个操作数组元素;支持面向数组操作的函数和构造块[1]。Fortran 90中运用动态数组需要三个步骤:   1)声明动态数组。明确数组的维数,不规定维的上、下界和大小(即延迟形状数组)。如:REAL,DIMENSION(:),ALLOCATABLE::X。   2)给动态数组分配内存。如:ALLOCATE(X(N))。   3)将分配的内存释放掉。如:DEALLOCATE(X)。   2 Fortran与C/C++的混合编译   在32位Windows系统下,同时安装Compaq Visual Fortran 6.x和Microsoft Visual C++ 6.0,则两者共享一个可视化开发环境(Microsoft Visual Studio 6.0)[1]。Fortran与C/C++任一种语言都可以作为主程序,调用另一种语言编写的例程。但两者在目标例程命名、堆栈管理以及参数传递方面的行为模式不完全一致,要协调其调用约定。   Fortran使用的调用约定有缺省约定(Default)、STDCALL约定和C约定。在Visual Fortran 6.x的编译器下,作用于例程参数和整个外部例程的属性不同,会影响堆栈管理、例程命名、参数传递。   2.1 堆栈管理   Fortran与C/C++间的例程调用是通过堆栈进行的???在缺省约定和STDCALL约定下,堆栈由被调用例程(Colleen)控制。在C约定下,堆栈由调用程序(Caller)控制,所以例程参数驻留在堆栈什么位置、占用多少字节等信息都是调用程序获知,该约定下传递参数的数量是可以变化的,是可选参数[2]。   2.2 例程命名   在编译生成的目标文件(.OBJ)中,标示符诸如全局变量、外部例程、模块等,在整个程序作用域内是独一无二的,共享于各个程序单元[3]。C对字母的大小写敏感,C++增加了特定的修饰,而Fortran忽略字母大小写,使得目标标示符在编译后发生变化。而命名约定,就是保持目标标示符在编译时一致性的命名规则。为保证链接成功,就要协调命名约定。   C++增加的修饰受特定系统影响,如将其去掉,就是在函数中添加C链接选项(extern “C”),则C++与C的命名约定相同。   协调Fortran与C/C++的例程命名分大写、小写和混合三种情况:   1)大写。Fortran是缺省约定,其目标外部例程名统一被转换为大写,那么在C/C++中须采用_stdcall约定,并用大写命名外部函数。   2)小写。Fortran是C约定或STDCALL约定,其目标外部例程名统一被转换为小写,那么在C/C++中须采用缺省约定_cdecl或_stdcall约定,并用小写命名外部函数。   3)大小写混合。C/C++的外部函数名是大小写混合形式,在Fortran中若要保持一致的形式,必须采用ALIAS属性来限定产生的目标例程名。   2.3参数传递   1)参数传递方式   Fortran参数传递方式取决于调用约定[4]。Default状态下,Fortran为引用传递;C或STDCALL约定状态下,数组参数为引用传递;单个参数为值传递。在调用约定之外,为忽略掉调用约定对参数传递的影响,可以规定参数拥有VALUE和REFERENCE传递属性[5]。在混合编程中,应通过VALUE和REFERENCE属性明确规定参数的传递方式,而不是依赖于调用约定。   C/C++参数传递方式不受调用约定影响。数组参数为引用传递;单个参数为值传递。单

文档评论(0)

317960162 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档