Fortran与C混合编程(转自Ubuntu)
Fortran与C混合编程
由于 GNU 的 Fortran 和 C 语言二者的函数彼此可以直接相互调用,所以混合编程可以非常容易地实现。只要你足够仔细,确保函数调用时传递的参数类型正确,函数就可以在两种语言间来回调用,就像它们是同一种语言一样。
下表中列出了 Fortran 的数据类型和它们在 C 中对应的类型。这张表在大多数平台下是没问题的,但是或许会有例外的情况发生。在你打算传递某种数据类型时,先编写一个简单的例子进行测试将是很明智的。
| C 类型 | Fortran 类型 | 描述 |
| signed char | INTEGER*1 | 8位有符号整数 |
| short | INTEGER*2 | 16位有符号整数 |
| int | INTEGER | 32位有符号整数 |
| float | REAL | 32位浮点数 |
| double | DOUBLE PRECISION | 64位浮点数 |
| 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 函数,函数传递的参数是一个字符串和一个浮点数:
C fortran2c.f
C
PROGRAM FORTRAN2C
C
CHARACTER*32 HELLO
REAL PI
C
HELLO = "Hello C from Fortran"
HELLO(21:21) = CHAR(0)
PI = 3.14159
CALL SHOWHIPI(HELLO,PI)
END PROGRAM FORTRAN2C
其中,可存储32个字符的 CHARACTER 型字符串变量 HELLO 中,存有 21 个字符,剩余部分用空格填充。要将该字符串格式化为 C 语言标准的字符串,我们必须在实际字符串结束的位置插入一个 ascii 码为“0”字符作为结束标志。而 REAL 型浮点数 PI 存储方式和 C 中 float 型变量完全一样,因此可以直接传递给函数。
理解 Fortran 的参数总是通过引用传递是非常重要的,因此 C 函数接收到的总是被传递的变量的地址而不是变量值本身。下面的 C 函数输出 Fortran 程序传递进来的字符串和和浮点数:
/* showhipi.c */
#include <stdio.h>
void showhipi_(char *string,float *pi)
{
printf("%s\nPI=%f\n",string,*pi);
}
在不同的平台下 Fortran 和 C 语言的命名惯例和数据类型的匹配关系是不同的。如同你在本例中看到的,在函数名后添加一下划线是必须的。
下面的命令编译两个源文件并将其链接成一个可执行程序:
$ gfortran -c fortran2c.f -o fortran2c.o
$ gcc -c showhipi.c -o showhipi.o
$ gfortran fortran2c.o showhipi.o -o fortran2c
最后一条命令也可用
$ gcc fortran2c.o showhipi.o -o fortran2c -lgfortranbegin -lgfortran
C调用Fortran函数
要在 C 中调用一个 Fortran 子程序,我们必须传递参数的地址并将字符串格式化为 Fortran 的格式。在下面的例子的,我们给 Fortran 子程序传递了一个字符串和一个浮点数:
/* c2fortran.c */
int main(int argc,char *argv[])
{
int i;
float e = 2.71828;
char hello[32];
int length = sizeof(hello);
strcpy(hello,"Hello Fortran from C");
for(i=strlen(hello); i<length; i++)
hello[i] = ' ';
showhie_(hello,&length,&e);
return(0);
}
在 C 中,字符串的长度是由 null 字符的位置决定的,但在 Fortran 中,所有字符串的长度都是固定的。由于 Fortran 没有办法确定传递给它字符串的长度,我们必须将字符串长度作为参数同时传递。
本例中,字符数组用空格填充,数组大小作为第二个参数传递。注意到三个参数都是通过指针传递的──因为 Fortran 总是期待地址而不是真实的值。在被调用的子程序名后添加一下划线通常是必须的。
下面是被调用的 Fortran 子程序的源代码:
C showhie.f
C
SUBROUTINE SHOWHIE(HELLO,LENGTH,E)
CHARACTER*(*) HELLO
INTEGER LENGTH
REAL E
C
WRITE(*,100) HELLO(1:LENGTH),LENGTH,E
100 FORMAT(3X,A,2X,I3,4X,F6.4)
RETURN
END SUBROUTINE SHOWHIE
下面的三条命令编译源文件并链接成一个可执行文件:
$ gfortran -c showhie.f -o showhie.o
$ gcc -c c2fortran.c -o c2fortran.o
$ gfortran c2fortran.o showhie.o -o c2fortran
Fortran与C混合编程(转自Ubuntu)的更多相关文章
- [转载:]C#与Fortran混合编程之本地调用Fortran动态链接库
前言 C#发展到现在,已是一门相当完善的语言,他基于C语言风格,演化于C++.并依靠强大的.NET底层框架.C#可以用来快速构建桌面及Web应用.然而在我们的实际工作中,尽管C#已经非常完善,但还是不 ...
- Fortran与C/C++混合编程示例
以下例子均来自网络,只是稍作了编辑,方便今后查阅. 子目录 (一) Fortran调用C语言 (二) C语言调用Fortran (三) C++ 调用Fortran (四) Fortran 调用 C++ ...
- 【混合编程】C/C++调用Fortran的DLL
[混合编程]C/C++调用Fortran的DLL 以一个简单的加法器为例,介绍C/C++调用Fortran语言DLL的操作过程 一.Fortran操作 1.1 Fortran代码 首先是加法功能的实现 ...
- C和C++混合编程中的extern "C" {}
引言 在用C++的项目源码中,经常会不可避免的会看到下面的代码: 1 2 3 4 5 6 7 8 9 #ifdef __cplusplus extern "C" { #endif ...
- 【转载】ANSYS的APDL与C语言混合编程(实例)
原文地址:http://www.cnblogs.com/lyq105/archive/2010/05/04/1727557.html 本文讨论的不是利用C语言为ANSYS写扩展(或者说是用户子程序), ...
- 使用 ctypes 进行 Python 和 C 的混合编程
Python 和 C 的混合编程工具有很多,这里介绍 Python 标准库自带的 ctypes 模块的使用方法. 初识 Python 的 ctypes 要使用 C 函数,需要先将 C 编译成动态链接库 ...
- 在Qt(C++)中与Python混合编程
一.PythonQt库 在Qt(C++)中与Python混合编程,可以使用PythonQt库. 网站首页:http://pythonqt.sourceforge.net 下载页面:https://so ...
- VC 与Matlab混合编程之引擎操作详解
Visual C++ 是当前主流的应用程序开发环境之一,开发环境强大,开发的程序执行速度快.但在科学计算方面函数库显得不够丰富.读取.显示数据图形不方便. Matlab 是一款将数值分析.矩阵计算.信 ...
- matlab和c++混合编程---matlab和vs的环境配置问题及方法和步骤(转载)
matlab和c++混合编程---方法和步骤 matlab和c++混合编程---matlab和vs的环境配置问题 摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序 ...
随机推荐
- Win环境下Oracle小数据量数据库的物理备份
Win环境下Oracle小数据量数据库的物理备份 环境:Windows + Oracle 单实例 数据量:小于20G 重点:需要规划好备份的路径,建议备份文件和数据库文件分别存在不同的存储上. 1.开 ...
- 剖析Elasticsearch集群系列第一篇 Elasticsearch的存储模型和读写操作
剖析Elasticsearch集群系列涵盖了当今最流行的分布式搜索引擎Elasticsearch的底层架构和原型实例. 本文是这个系列的第一篇,在本文中,我们将讨论的Elasticsearch的底层存 ...
- springmvc+jdbc连接数据库(第一个微商项目,代理注册)
String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");手动自动生成Uuid ...
- Python怎么样入门?Python基础入门教程
给大家整理的这套python学习路线图,按照此教程一步步的学习来,肯定会对python有更深刻的认识.或许可以喜欢上python这个易学,精简,开源的语言.此套教程,不但有视频教程,还有源码分享,让大 ...
- Ubuntu14.04桌面系统允许root登录
首先安装完系统后,在登录界面我们可以看到不允许root账户登录.以普通账户登录系统,打开终端.执行如下命令来设置root密码: sudo passwd root 然后执行命令修改如下配置文件: vi ...
- Java并发包基石-AQS详解
目录 1 基本实现原理 1.1 如何使用 1.2 设计思想 2 自定义同步器 2.1 同步器代码实现 2.2 同步器代码测试 3 源码分析 3.1 Node结点 3.2 独占式 3.3 共享式 4 总 ...
- jenkins IOS- ad-hoc 打包
背景 客户无大企业证书,只有开发者证书,如果进行开发分发测试只能采用两种方式 testfight ad-hoc打包 上testfight存在一定的审核时间,排除掉,最后选择打ad-hoc的包 解决 查 ...
- iOS事件响应链(Responder Chain)
概述 在iOS中,视图的层级一般都是 父视图->添加各种子视图.这时候某个视图(子视图)上有个按钮,需要我们交互.但是有时候我们会发现无论如何都没有反应.这时候可能就是我们对iOS的事件传递响应 ...
- Echarts关系图-力引导布局
需要做一个树形图,可以查看各个人员的关系. 可伸缩的力引导图-失败 刚开始,打算做一个可展开和伸缩的,搜索时候发现CSDN有一篇美美哒程序媛写的Echarts Force力导向图实现节点可折叠. 这里 ...
- 【B2B】2015 年B2B的春天
摘要 看看关于B2B的现状,以及行业发展近况. 现状 http://www.cyzone.cn/a/20160115/288471.html 行业发展 蓬勃发展的行业: 方兴未艾的行业: 未来的行业: