文章目录
-
- 数据类型
- implicit函数
- 数据类型转换
上节内容:
fortran安装和编译
数据类型
fortran
共有5中数据类型
整数 | 实数 | 复数 | 逻辑 | 字符 |
---|---|---|---|---|
integer | real | complex | logical | character |
kind
参数,可以指定变量所占位数,例如integer(kind=4)
表示占据4byte的整型,也就是32位整型。
len
参数,可以声明字符个数,例如character(len=80)
表示长度为80的字符串。
在声明变量时,数据类型和变量名之间用::
隔开,正如上节示例程序中的real :: a, b, res
。
fortran
除了变量之外,还有常量,例如logical
类型的两个值.true.
和.false.
就是两个常量。除此之外,若想创建常量,需要用到parameter
命令,例如
real pi
parameter(pi=3.1415926535)
也可以在声明时直接赋值
real, parameter :: pi = 3.1415926535
implicit函数
通过implicit
,可以将变量的首字母和数据类型关联起来,例如implicit integer(A-F,I,K)
,可以指定以A-F
或者I, K
开头的变量为整型,当然fortran是不分大小写的。
! impliTest.f95
program addNumimplicit complex(A-C)implicit real(D-G)implicit integer(i,j,k)a = 1d = 1i = 1print *, a, d, iend program addNum
编译之后得到结果
>gfortran impliTest.f95
1>a.exe
(1.00000000,0.00000000) 1.00000000 1
fortran
对变量首字母是有默认要求的,即不加任何implicit
的情况下,变量名以i, j, k, l, m, n
开头即为整型,否则位浮点型,此即fortran77的I-N规则。惊闻此讯,那不得赶紧尝鲜一下77年的规则?
但刚刚在试复数时发现了一个问题,尽管复数是fortran的内置类型,但要怎样才能创建一个复数呢?
这就是接下来要说的,数据类型转换。
数据类型转换
首先要解决的问题是创建复数的问题,这个很容易,只需cmplx(x, [y, kind])
,可以将x
和y
转换为x+iu
,y
默认为0。
其他的数据类型转换主要涉及到整型和实型,由整数变成实数非常容易,只需考虑转换的位数问题,dble
将整数转换为双精度浮点数;real(a [,kind])
函数可将a
转为kind
位的实数。
反之则稍微复杂,由于涉及到舍入问题,故有四种转换函数
函数 | 说明 | 函数 | 说明 |
---|---|---|---|
int |
取a的整数部分 | nint |
四舍五入 |
ceiling |
向上取整 | floor |
向下取整 |
有两个函数也有取整功能,但不改变数据类型,aint
和anint
的功能与int, nint
相同,但返回值是实数。
字符虽然看上去和数字没什么关系,但其编码过程仍然需要与数字进行意义对应,fortran
中提供了ASCII码的转换函数
ACHAR(n)
将ASCII转为字符,n=0,1,⋯,127n=0,1,\cdots,127n=0,1,⋯,127CHAR(n)
将ASCII转为字符,n=0,1,⋯,255n=0,1,\cdots,255n=0,1,⋯,255IACHAR(c)
将字符c
转为ASCII,范围是0,1,⋯,1270,1,\cdots,1270,1,⋯,127ICHAR(c)
将字符c
转为ASCII,范围是0,1,⋯,2550,1,\cdots,2550,1,⋯,255
指针
在fortran
中,指针需要用关键字pointer
来声明,通过函数allocate
来开辟指针的内存,具体示例如下
program ptTest
implicit noneinteger, pointer :: p1allocate(p1)p1 = 1print *, p1p1 = p1 + 4print *, p1end program ptTest
由于指针只有在面对复杂的数据结构时,才会绽放威力,所以这里就不细说了。