Fortran与C混合编程(转自Ubuntu)
来源:互联网 发布:三菱plc编程软件id 编辑:程序博客网 时间:2024/04/30 07:50
Fortran与C混合编程
由于 GNU 的 Fortran 和 C 语言二者的函数彼此可以直接相互调用,所以混合编程可以非常容易地实现。只要你足够仔细,确保函数调用时传递的参数类型正确,函数就可以在两种语言间来回调用,就像它们是同一种语言一样。
下表中列出了 Fortran 的数据类型和它们在 C 中对应的类型。这张表在大多数平台下是没问题的,但是或许会有例外的情况发生。在你打算传递某种数据类型时,先编写一个简单的例子进行测试将是很明智的。
C 类型Fortran 类型描述signed charINTEGER*18位有符号整数shortINTEGER*216位有符号整数intINTEGER32位有符号整数floatREAL32位浮点数doubleDOUBLE PRECISION64位浮点数void sub_()SUBROUTINE SUB()无返回值的 C 函数等价于 Fortran 子程序float fun_()REAL FUNCTION FUN()有返回值的 C 函数等价于 Fortran 的函数
由于 Fortran 总是以引用的方式传递参数,而 C 则始终以地址方式传递数组,因此数组做参数时不需做任何修改。但是对多维数组来说,混合调用时其下标需要翻转,因为 Fortran 的数组是以列为主序(column-major order)而 C 数组以行为主序(row-major order)。
Fortran调用C函数
下面的 Fortran 程序调用一个 C 函数,函数传递的参数是一个字符串和一个浮点数:
其中,可存储32个字符的 CHARACTER 型字符串变量 HELLO 中,存有 21 个字符,剩余部分用空格填充。要将该字符串格式化为 C 语言标准的字符串,我们必须在实际字符串结束的位置插入一个 ascii 码为“0”字符作为结束标志。而 REAL 型浮点数 PI 存储方式和 C 中 float 型变量完全一样,因此可以直接传递给函数。
理解 Fortran 的参数总是通过引用传递是非常重要的,因此 C 函数接收到的总是被传递的变量的地址而不是变量值本身。下面的 C 函数输出 Fortran 程序传递进来的字符串和和浮点数:
在不同的平台下 Fortran 和 C 语言的命名惯例和数据类型的匹配关系是不同的。如同你在本例中看到的,在函数名后添加一下划线是必须的。
下面的命令编译两个源文件并将其链接成一个可执行程序:
最后一条命令也可用
C调用Fortran函数
要在 C 中调用一个 Fortran 子程序,我们必须传递参数的地址并将字符串格式化为 Fortran 的格式。在下面的例子的,我们给 Fortran 子程序传递了一个字符串和一个浮点数:
在 C 中,字符串的长度是由 null 字符的位置决定的,但在 Fortran 中,所有字符串的长度都是固定的。由于 Fortran 没有办法确定传递给它字符串的长度,我们必须将字符串长度作为参数同时传递。
本例中,字符数组用空格填充,数组大小作为第二个参数传递。注意到三个参数都是通过指针传递的──因为 Fortran 总是期待地址而不是真实的值。在被调用的子程序名后添加一下划线通常是必须的。
下面是被调用的 Fortran 子程序的源代码:
下面的三条命令编译源文件并链接成一个可执行文件:
- Fortran与C混合编程(转自Ubuntu)
- Fortran与C的混合编程
- Fortran与C混合编程,C调用Fortran函数,Fortran再回调C中的函数
- FORTRAN/C/C++混合编程
- C#与Fortran混合编程
- Fortran与C语言混合编程中的文件处理
- windows下intel C/Fortran 混合编程
- windows下intel C/Fortran 混合编程
- FORTRAN/C/C++混合编程注意事项
- Delphi 与 FORTRAN语言的混合编程
- Delphi 与 FORTRAN语言的混合编程
- Matlab与Fortran混合编程:m…
- win64 qt与fortran (codeblocks) 混合编程
- Fortran与C/C++的混合开发
- VS与IVF C/C++与Fortran混合编程的终极解决方案
- VS与IVF C/C++与Fortran混合编程的解决方案
- Fortran C++混合编程
- C/C++/Fortran混合编程浅谈------直接链接方式
- Python循环与条件控制语句
- ubuntu下快速安装MySQL WorkBench
- Android studio 中git的使用 图文详解
- [8] ffmpeg + SDL2 实现的视频播放器「快进、快退」
- linux下几种快速清空文件内容的方法
- Fortran与C混合编程(转自Ubuntu)
- IOS 压缩图片到指定大小kb
- 将MongoDB作为windows服务来安装,出现“服务没有响应控制功能”错误
- 解决“Dynamic Web Module 3.0 requires Java 1.6 or newer.”错误
- 分支结构01
- 详解互联网平台的资金系统方案 自建支付清结算系统优势明显
- Eclipse中显示空格、制表符和回车
- Nginx实战(二) URL重写
- js--原型、封装和继承