由于 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
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
第1个字符
|
如果是C、c或者星号*,这行文本会被当成说明批注,不会被编译
|
第1~5个字符
|
如果是数字,就是用来给这一行程序代码取个代号。不然只能是空格
|
第6个字符
|
如果是“0”以外的任何字符,表示这一行程序会接续上一行
|
第7~72个字符
|
Fortran程序代码的编写区域
|
第73个字符之后
|
不使用,超过的部分会被忽略,有的编译器会发出错误信息
|
Program ex
Character(len=20) string
String = “Good morning.”
Write(*,*) string
String(6) = “evening.” !重新设置从第六个字符之后的字符串
Write(*,*) string
end
|
Char(num)
|
返回计算机所使用的字符表上,数值num所代表的字符
|
IChar(char)
|
返回所输入的char字符在计算机所使用的字符表中所代表的编号,返回值是整数类型
|
Len(string)
|
返回输入字符串的声明长度,返回值是整数类型
|
Len_Trim(String)
|
返回字符串去除尾端空格后的实际内容长度
|
Index(string,key)
|
所输入的String和key都是字符串。这个函数会返回key这个“子字符串”在“母字符串”String中第一次出现的位置
|
Trim(string)
|
返回把string字符串尾端多余空格清除过后的字符串
|
Program ex
Integer a
a = 100
write(*,100) a !使用行代码100,也就是第五行的格式来输出变量a
100 format(I4) !最前面的100是行代码,把这一行程序代码给一个编号
End
|
Aw
|
以w个字符宽来输出字符串
|
BN
|
定义文本框中的空位为没有东西,在输入时才需要使用
|
BZ
|
定义文本框中的空位代表0,在输入时才需要使用
|
Dw.d
|
以w个字符宽来输出指数类型的浮点数,小数部分占d个字符宽
|
Ew.d[Ee]
|
以w个字符宽来输出指数类型的浮点数,小数部分占d个字符宽,指数部分占e个字符
|
ENw.d[Ee]
|
以指数类型来输出浮点数
|
ESw.d[Ee]
|
以指数类型来输出浮点数
|
Fw.d
|
以w个字符宽来输出浮点数,小数部分占d个字符宽
|
Gw.d[Ee]
|
以w个字符宽来输出整数,最少输出m个数字
|
Iw[.m]
|
以w个字符宽来输出整数,最少输出m个数字
|
Lw
|
以w个字符宽来输出T或F的真假值
|
nX
|
把输出的位置向右跳过n个位置
|
/
|
代表换行
|
:
|
在没有更多数据时结束输出
|
kP
|
K值控制输入输出的SCALE
|
Tn
|
输出的位置移动到本行第n列
|
TLn
|
输出的位置向左相对移动n列
|
TRn
|
输出的位置向右相对移动n列
|
SP
|
在数值为正时加上“正号”
|
SS
|
取消SP
|
Fortran 90添加的格式
|
|
Bw[.m]
|
把整数转换成二进制来输出、输出会占w个字符宽,固定输出m个数字。m值可以不给定
|
Ow[.m]
|
把整数转换成八进制来输出,输出会占w个字符宽,固定输出m个数字。m值可以不给定
|
Zw[.m]
|
把整数转换成十六进制来输出,输出会占w个字符宽,固定输出m个数字。m值可以不给定
|