fortran中类型

-

由于 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

 
 
字符:Fortran不区分大小写
Fortran 格式:自由格式和固定格式。Fortran程序代码扩展名为:*.For 或*.F的文件就是指固定格式;以*.F90为扩展名的文件,就是自由格式。
à固定格式:规定了程序代码每一行中每个字段的意义。第7~72个字符,是可以用来编写程序的字段。每一行的前5个字符只能是空格或数字,数字用来作为“行代码”。每一行的第6个字符只能是空格或“0”以外的字符。
第1个字符
如果是C、c或者星号*,这行文本会被当成说明批注,不会被编译
第1~5个字符
如果是数字,就是用来给这一行程序代码取个代号。不然只能是空格
第6个字符
如果是“0”以外的任何字符,表示这一行程序会接续上一行
第7~72个字符
Fortran程序代码的编写区域
第73个字符之后
不使用,超过的部分会被忽略,有的编译器会发出错误信息
à自由格式:叹号(!)后面的文本都是注释。 每行可以编写132个字符。行号放在每行程序的最前面。一行程序代码的最后如果是符号&,代表下一行程序会和这一行连接;如果一行程序代码的开头是符号&,代表它会和上一行程序连接。
Fortran的数据类型
à整型(Integer) à浮点数(Real) à复数(Complex) à字符(Character)
à逻辑判断(Logical)—True or False
Remark: Visual Fortran安装好后,默认的安装目录C:\Program Files\Microsoft Visual Studio\DV98\bin下有一个Bitviewer程序可以用来表看各种数据格式实际在内存中的二进制数据。
Fortran的数学表达式
()(括号)、**(乘幂)、*(乘法)or /(除法)、+(加法) or –(减法) à优先级(高 à低).
输入(Write)输出(Print)命令
Fortran程序通常以Program描述来开头,Program后面还要接一个自定义的程序名称(这个名称可以完全自定义,不需要和文件名有任何关系)。Fortran程序最后还要有End描述,表示程序代码写到这一行结束。
Write(*,*)命令:括号中的两个星号都有各自的意义,第一个星号代表输出的位置使用默认值,也就是屏幕,第二个星号则代表不特别设置输出格式。
终归一句话,Write这个命令的最简单用法,就是在括号中挂上两个星号,再把所要输出的字符串用两个双引号引起来放在后面。
E.g.:write (*,*) “Hello, Acuzio!” à 完整的写法 write(Unit = *, FMT=*) “Hello, Acuzio!”
Write命令注意:
l 每一次执行Write命令后,会自动切换到下一行来准备做下一次的输入
l 因为双引号是用来“输出”字符串的,所以想要输出双引号时,要连用两个双引号。
l Fortran90可以使用双引号或单引号来封装字符串,Fortran77标准中只能使用单引号,不过大部分的Fortran77编译器还是可以接受双引号。
STOP命令:是终止程序的意思,它可以出现在程序的任何地方,程序执行到这个命令就会中止。除非必要,不要把Stop命令使用在主程序结束之外的其他地方。因为一个程序,如果有太多的终止点会容易出错。
把上面例子中用Print命令,程序执行的结果是一样的 àPrint *, ”Hello, Acuzio!”
Print的用法和write大致上相同,只是print后面不使用括号,而且只有一个星号。这个星号的意义是不限定输出格式。Print和Write的不同处就在于少了Write的第一个星号,也就是少了赋值输出位置的能力,Print命令只能针对屏幕来使用。 建议尽量使用Write来做输出的工作,因为如果日后想把程序的输出转换到其他地方,例如转换到文件中,使用Write命令的程序改写起来比较容易,只有把UNIT值指到另一个输出位置就行了。
Integer:Integer(kind = 4) a Integer *4 aInteger(4) a
其中kind=4、*4、(4)都是赋值要使用4个bytes来存放整数的意思。
声明变量的原则
l 变量的名称以使用英文字母为原则,可以内含下划线或数字,但前缀必须是英文字母
l 变量名字的长度,在77标准中最起码支持6个字符长,90标准中最起码支持31个字符长。也就是说在Fortran77中变量长度最后是在1~6之间,在Fortran90中变量长度则最后是在1~31之间
l 变量名称最好不要和Fortran的执行命令同名,也不能和主程序的名称或是前面声明过的变量同名。
l 程序中辨认变量时,不会区分它的大小写
Fortran90的声明语法多了一些变化,它可以在类型的后面先写两个冒号“::”,再写上变量的名称
Real:
Real(kind=4)表示单精度。Real(kind=8)表示双精度
Complex
Fortran中声明复数的方法:Complex a
复数是有实部和虚部两个部分组成,而Fortran中保存这两个数字的方法是用两个浮点数来保存,所有复数也可以分成单精度及双精度两种类型。
要设置一个复数数值的方法如下:a=(x,y) !x为实部,y为虚部,当a=(3.2,2.5)时,表示a=3.2+2.5i
Character:
声明:character(len=10) a character(10)a character*10 acharacter*(10) a
字符串长度需要多少字符,就赋值多少数字给它
Program ex
Character(len=20) string
String = “Good morning.”
Write(*,*) string
String(6) = “evening.” !重新设置从第六个字符之后的字符串
Write(*,*) string
end
上例中 string(1:2) = “GO” !字符串最前面两个字符会变成GO
String(13:13)=”!” !字符串的第13个字符会变成叹号
用(//)可以把前后两个字符串连接起来
Fortran有关字符串运行的函数
Char(num)
返回计算机所使用的字符表上,数值num所代表的字符
IChar(char)
返回所输入的char字符在计算机所使用的字符表中所代表的编号,返回值是整数类型
Len(string)
返回输入字符串的声明长度,返回值是整数类型
Len_Trim(String)
返回字符串去除尾端空格后的实际内容长度
Index(string,key)
所输入的String和key都是字符串。这个函数会返回key这个“子字符串”在“母字符串”String中第一次出现的位置
Trim(string)
返回把string字符串尾端多余空格清除过后的字符串
Logical
逻辑变量并赋值。Logical a = .true.
设置逻辑变量的方法:当设置“真”值或者“假”值,请注意要在true和false的前后要加上两个点
输入命令Read
Read(*,*) read命令在使用时和write一样,都有两个星号。代表的意义也是差不多的,第一个星号代表输入的来源使用默认的设备(也就是键盘),第二个星号代表不指定输入格式
格式化输入输出(Format)
Program ex
Integer a
a = 100
write(*,100) a !使用行代码100,也就是第五行的格式来输出变量a
100 format(I4) !最前面的100是行代码,把这一行程序代码给一个编号
End
Format格式
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值可以不给定
 

你可能感兴趣的:(Fortran)