本附录介绍了标准 Fortran 与 Solaris Studio Fortran 编译器 f95 之间的一些主要功能差异。
f95 编译器提供标准 Fortran 的以下源语言功能和扩展。
f95 允许 999 个续行(1 个初始行和 999 个续行)。对于固定格式,标准 Fortran 允许 19 个续行;对于自由格式,允许 39 个续行。
在固定格式源代码中,行的长度可以超过 72 个字符,但忽略第 73 列以后的任何内容。标准 Fortran 95 仅允许 72 个字符长的行。
如果第 1 列至第 6 列的任一列中有制表符,都会使该行成为制表符格式的源代码行。
制表符前面可以有注释指示符或语句编号。
如果制表符是第一个非空字符,会出现以下情况:
如果制表符后面的字符不是非零数字,则制表符后面的文本是初始行。
如果第一个制表符后面是非零数字,则该行是续行。非零数字后面的文本是语句的下一个部分。
对于固定格式,f95 的缺省最大行长度是 72 列;对于自由格式,则为 132 列。使用 -e 编译器选项,可将固定格式源代码中的行扩展到 132 列。
示例: 左侧的制表符格式源代码的处理方式如右侧所示。
|
|
在以上示例中,"^I" 代表制表符,以 "1" 和 "2" 开头的行是续行。显示此代码的目的在于说明各种制表符情形,而不是提倡任一样式。
f95 中的制表符会强制填充剩余的行直到第 72 列。如果制表符出现在持续到下一行的字符串中,则可能会引发意外结果:
源文件:
^Iprint *, "Tab on next line ^I1this continuation line starts with a tab." ^Iend |
运行代码:
Tab on next line this continuation line starts with a tab. |
此外,对于制表符格式允许使用 —f77 选项。
具有 .f 或 .F 后缀的文件采用固定格式。带 .f90、.f95、.F90 或 .F95 后缀的文件假定采用自由格式。
表 4–1 F95 源代码格式命令行选项
选项 |
操作 |
---|---|
-fixed |
将所有源文件解释为 Fortran 固定格式 |
-free |
将所有源文件解释为 Fortran 自由格式 |
如果使用 -free 或 -fixed 选项,则它覆盖文件名后缀。如果使用 !DIR$ FREE 或 !DIR$ FIXED 指令,则它覆盖选项和文件名后缀。
允许混合使用某些源代码格式。
在同一个 f95 命令中,一些源文件可以是固定格式,而另一些源文件可以是自由格式。
在同一个文件中,可以通过使用 !DIR$ FREE 和 !DIR$ FIXED 指令将自由格式与固定格式混合使用。
在同一个程序单元中,可以将制表符格式与自由格式或固定格式混合使用。
缺省情况下,Solaris Studio Fortran 不区分大小写。这意味着,变量 AbcDeF 的处理方式与将其拼写为 abcdef 时相同。要让编译器区别处理大写字母和小写字母,请使用 -U 选项进行编译。
本节介绍 Fortran 数据类型的功能和扩展。
f95 支持布尔类型的常量和表达式。但是,没有布尔变量或数组,也没有布尔类型语句。
对于屏蔽操作,按位逻辑表达式具有布尔结果;它的每个位都是对相应操作数位进行一个或多个逻辑运算的结果。
用于二进制算术运算符和关系运算符:
如果一个操作数是布尔型,则在执行运算时不进行转换。
如果两个操作数均是布尔型,则在执行运算时就当它们是整数一样。
用户指定的函数均不能生成布尔结果,但某些(非标准的)内部函数可以。
布尔和逻辑类型具有以下差异:
变量、数组和函数可以是逻辑类型,但它们不能是布尔类型。
可以使用 LOGICAL 语句,但不能使用 BOOLEAN 语句。
逻辑型的变量、常量或表达式仅有两个值:.TRUE. 或 .FALSE.。布尔型的变量、常量或表达式可以表示任意二进制值。
逻辑型实体在算术表达式、关系表达式或按位逻辑表达式中无效。布尔型实体在所有 3 种表达式中都有效。
f95 允许使用以下替代格式(没有二进制)的布尔常量(八进制、十六进制或霍尔瑞斯)。不能将变量声明为布尔型。标准 Fortran 不允许使用这些格式。
可以使用字母 B 或 b。
可以是 1 至 11 个八进制数字(0 至 7)。
11 个八进制数字表示完整的 32 位字,最左侧的数字可以是 0、1、2 或 3。
每个八进制数字指定 3 位的值。
最后一个(最右侧的)数字指定最右侧 3 位(位 29、30 和 31)的内容。
如果位数不足 11 个,则该值右对齐,即它表示字最右侧的位:位 n 至 31。其他位为 0。
忽略空格。
在 I/O 格式规范中,字母 B 表示二进制数字;而在其他地方则表示八进制数字。
X’ddd’ 或 X"ddd ",其中 d 是任意十六进制数字
可以包含 1 至 8 个十六进制数字(0 至 9,A-F)。
任何字母既可以是大写也可以是小写(X、x、A-F、a-f)。
数字必须用撇号或引号括起来。
忽略空格。
十六进制数字可以以 + 或 - 符号开头。
8 个十六进制数字表示一个完整的 32 位字,等效的二进制数字对应于 32 位字中每个位的内容。
如果位数不足 8 个,则该值右对齐,即它表示字最右侧的位:位 n 至 31。其他位为 0。
接受的霍尔瑞斯数据格式为:
nH… |
’…’H |
"…"H |
nL… |
’…’L |
"…"L |
nR… |
’…’R |
"…"R |
上面的 "…" 是字符串,n 是字符数。
示例: 八进制和十六进制常量。
布尔常量 |
32 位字的内部八进制数 |
---|---|
0B |
00000000000 |
77740B |
00000077740 |
X"ABE" |
00000005276 |
X"-340" |
37777776300 |
X’1 2 3’ |
00000000443 |
X’FFFFFFFFFFFFFFFF’ |
37777777777 |
示例: 赋值语句中的八进制和十六进制数。
i = 1357B j = X"28FF" k = X’-5A’ |
在算术表达式中使用八进制或十六进制常量可产生未定义的结果,并且不会生成语法错误。
f95 允许在非 DATA 语句中使用 BOZ 常量。
B’bbb’ |
O’ooo’ |
Z’zzz’ |
B"bbb" |
O"ooo" |
Z"zzz" |
如果将它们赋值给实数变量,则不进行类型转换。
标准 Fortran 只允许在 DATA 语句中使用它们。
f95 允许在声明语句、函数语句和 IMPLICIT 语句中使用以下非标准的类型声明格式。第一列中的格式虽然已被广泛使用,但它们是非标准的 Fortran 格式。第二列中的种类数字可能会因供应商不同而异。
表 4–2 数值数据类型的大小表示法
非标准 |
声明符 |
简短形式 |
含义 |
---|---|---|---|
INTEGER*1 |
INTEGER(KIND=1) |
INTEGER(1) |
有符号的单字节整数 |
INTEGER*2 |
INTEGER(KIND=2) |
INTEGER(2) |
有符号的双字节整数 |
INTEGER*4 |
INTEGER(KIND=4) |
INTEGER(4) |
有符号的 4 字节整数 |
LOGICAL*1 |
LOGICAL(KIND=1) |
LOGICAL(1) |
单字节逻辑值 |
LOGICAL*2 |
LOGICAL(KIND=2) |
LOGICAL(2) |
双字节逻辑值 |
LOGICAL*4 |
LOGICAL(KIND=4) |
LOGICAL(4) |
4 字节逻辑值 |
REAL*4 |
REAL(KIND=4) |
REAL(4) |
IEEE 单精度 4 字节浮点值 |
REAL*8 |
REAL(KIND=8) |
REAL(8) |
IEEE 双精度 8 字节浮点值 |
REAL*16 |
REAL(KIND=16) |
REAL(16) |
IEEE 四精度 16 字节浮点值 |
COMPLEX*8 |
COMPLEX(KIND=4) |
COMPLEX(4) |
单精度复数(每个部分 4 个字节) |
COMPLEX*16 |
COMPLEX(KIND=8) |
COMPLEX(8) |
双精度复数(每个部分 8 个字节) |
COMPLEX*32 |
COMPLEX(KIND=16) |
COMPLEX(16) |
四精度复数(每个部分 16 个字节) |
存储和对齐始终以字节为单位。可以划分为单字节的值按字节对齐。
类型的大小和对齐取决于各种编译器选项和平台以及变量的声明方式。COMMON 块中的缺省最大对齐位置是 4 字节边界。
使用特殊选项(如 -aligncommon、-f、-dalign、-dbl_align_all、- xmemalign 和 - xtypemap)进行编译,可以更改缺省的数据对齐和存储分配。本手册中的缺省描述假定这些选项无效。
《Fortran 编程指南》提供了有关某些平台上数据类型和对齐方式特例的其他信息。
下表汇总了缺省的大小和对齐,并忽略类型和选项的其他方面。
表 4–3 缺省的数据大小和对齐(以字节为单位)
Fortran 数据类型 |
大小 |
缺省对齐 |
COMMON 中的对齐 |
---|---|---|---|
BYTE X CHARACTER X CHARACTER*n X |
1 1 n |
1 1 1 |
1 1 1 |
COMPLEX X COMPLEX*8 X DOUBLE COMPLEX X COMPLEX*16 X COMPLEX*32 X |
8 8 16 16 32 |
4 4 8 8 8/16 |
4 4 4 4 4 |
DOUBLE PRECISION X REAL X REAL*4 X REAL*8 X REAL*16 X |
8 4 4 8 16 |
8 4 4 8 8/16 |
4 4 4 4 4 |
INTEGER X INTEGER*2 X INTEGER*4 X INTEGER*8 X |
4 2 4 8 |
4 2 4 8 |
4 2 4 4 |
LOGICAL X LOGICAL*1 X LOGICAL*2 X LOGICAL*4 X LOGICAL*8 X |
4 1 2 4 8 |
4 1 2 4 8 |
4 1 2 4 4 |
请注意以下事项:
REAL*16 和 COMPLEX*32:在 64 位环境(使用 -m64 进行编译)中,缺省对齐位置是 16 字节(而非 8 字节)边界,如表中 8/16 所示。该数据类型通常称为四精度。
数组和结构按照其元素或字段对齐。数组对齐方式与数组元素相同。结构对齐方式与具有最宽对齐的字段相同。
选项 -f 或 -dalign 可强制将所有 8、16 或 32 字节数据与 8 字节边界对齐。选项 -dbl_align_all 可使所有数据与 8 字节边界对齐。如果程序依赖于这些选项的使用,则可能无法进行移植。
Cray 指针是一个变量,其值是另一个实体(称为指针对象)的地址。
f95 支持 Cray 指针;标准 Fortran 95 不支持。
Cray POINTER 语句采用以下格式:
POINTER ( pointer_name, pointee_name [array_spec] ), … |
其中,pointer_name、pointee_name 和 array_spec 如下所示:
指向相应 pointee_name 的指针。
pointer_name 包含 pointee_name 的地址。必须是一个标量变量名称(但不是派生类型)。不能是常量、结构名称、数组或函数。
指向相应 pointer_name 的指针对象
必须是: 变量名、数组声明符或数组名称
如果 array_spec 存在,则它必须是显形(常量或非常量边界)或者假定大小。
例如,可以声明指向两个指针对象的 Cray 指针:
POINTER ( p, b ), ( q, c ) |
以上示例声明 Cray 指针 p 及其指针对象 b 以及 Cray 指针 q 及其指针对象 c。
还可以声明指向数组的 Cray 指针:
POINTER ( ix, x(n, 0:m) ) |
以上示例声明 Cray 指针 ix 及其指针对象 x;并将 x 声明为 n x (m+1) 维数组。
通过将变量与存储块中的特定位置动态关联起来,您可以使用指针访问用户管理的存储。
Cray 指针允许访问绝对内存地址。
POINTER ( pointer_name, pointee_name [array_spec] )
Fortran 95 指针声明如下:
POINTER object_name
不能混用这两种类型的指针。
无论何时引用指针对象,f95 均使用当前的指针值作为指针对象的地址。
Cray 指针类型语句声明指针和指针对象。
Cray 指针为 Cray 指针类型。
在 32 位处理器中,Cray 指针的值占用一个存储单元;在 64 位处理器中,Cray 指针的值占用两个存储单元。
Cray 指针可以出现在 COMMON 列表中,也可以作为哑元参数。
在定义 Cray 指针的值之前,Cray 指针对象没有地址。
如果将数组命名为指针对象,则该数组称为指针对象数组。
其数组声明符可以出现在:
单独的类型语句
单独的 DIMENSION 语句中
指针语句本身
如果数组声明符在子程序中,则维数赋值可以引用:
COMMON 块中的变量或
作为哑元参数的变量
每个维的大小是在进入子程序时计算的,而不是在引用指针对象时计算的。
pointee_name 不得是类型为 CHARACTER*(*) 的变量。
如果 pointee_name 是数组声明符,则它必须是显形(常量或非常量边界)或假定大小。
不允许使用 Cray 指针数组。
Cray 指针不能:
是由另一个 Cray 指针或 Fortran 指针指向的指针。
是结构的组件。
声明为任何其他数据类型。
Cray 指针不能出现在:
PARAMETER 语句或包含 PARAMETER 属性的类型声明语句中。
DATA 语句中。
Cray 指针对象不能出现在 SAVE、DATA、EQUIVALENCE、COMMON 或 PARAMETER 语句中。
Cray 指针对象不能是哑元参数。
Cray 指针对象不能是函数值。
Cray 指针对象不能是结构或结构组件。
Cray 指针对象不能是派生类型。
可以将 Cray 指针赋值如下:
设置为绝对地址
示例: q = 0
赋值给整数变量、加或减表达式或从整数变量、加或减表达式中赋值
示例: p = q + 100
Cray 指针不是整数。不能将它们赋值给实数变量。
LOC 函数(非标准)可用于定义 Cray 指针。
示例: p = LOC( x )
示例: 按上述方式使用 Cray 指针。
SUBROUTINE sub ( n ) COMMON pool(100000) INTEGER blk(128), word64 REAL a(1000), b(n), c(100000-n-1000) POINTER ( pblk, blk ), (ia, a ), ( ib, b ), & ( ic, c ), ( address, word64 ) DATA address / 64 / pblk = 0 ia = LOC( pool ) ib = ia + 4000 ic = ib + n ... |
有关以上示例的说明:
word64 引用绝对地址 64 的内容
blk 是占用内存前 128 个字的数组
a 是块公用区中长度为 1000 的数组
b 跟在 a 的后面,其长度为 n
c 跟在 b 的后面
a、b 和 c 与 pool 相关联
word64 与 blk(17) 相同,因为 Cray 指针是字节地址,而且 blk 的每个整数元素都是 4 字节长
为帮助迁移用旧版 FORTRAN 77 编写的程序,f95 接受 VAX Fortran STRUCTURE 和 UNION 语句,它是 Fortran 95 中“派生类型”的前身。有关语法的详细信息,请参见《FORTRAN 77 Language Reference》手册。
STRUCTURE 中的字段声明可以是以下内容之一:
子结构-另一个 STRUCTURE 声明或一个先前定义的记录。
UNION 声明。
TYPE 声明,它可以包含初始值。
具有 SEQUENCE 属性的派生类型。(这是 f95 所特有的。)
与传统 f77 编译器相同,POINTER 语句不能用作域声明。
f95 还允许:
"." 或 "%" 均可用作结构域非关联化符号:struct.field 或 struct%field。
结构可以出现在格式化 I/O 语句中。
可以在 PARAMETER 语句中初始化结构;格式与派生类型初始化相同。
结构可以作为派生类型中的组件,但必须使用 SEQUENCE 属性声明派生类型。
Fortran 编译器接受新的数据类型 UNSIGNED 作为对该语言的一种扩展。UNSIGNED 接受四个 KIND 参数值: 1、2、4 和 8,分别对应于 1、2、4 和 8 字节无符号整数。
无符号整型常量的形式是:数字串后跟大写或小写字母 U,再后跟一个下划线和种类参数(可选)。下面的示例显示了无符号整型常量的最大值:
255u_1 65535u_2 4294967295U_4 18446744073709551615U_8 |
如果没有使用种类参数 (12345U),则缺省值与缺省整数相同。缺省值为 U_4,但可以使用 -xtypemap 选项更改它,这会更改缺省无符号整数的种类类型。
可使用 UNSIGNED 类型说明符声明无符号整型变量或数组:
UNSIGNED U UNSIGNED(KIND=2) :: A UNSIGNED*8 :: B |
二进制运算(如 + - * /)不能混合使用有符号操作数和无符号操作数。即,如果将 U 声明为 UNSIGNED 并且 N 是有符号的 INTEGER,则 U*N 是非法的。
可使用 UNSIGNED 内部函数将二进制运算中的混合操作数组合起来,例如 U*UNSIGNED(N)。
有一种例外情况是,如果一个操作数是无符号整数,而另一个操作数是具有正值或零值的有符号整数常量表达式,则结果是无符号整数。
此类混合表达式的结果的类型,是操作数最常见的类型。
有符号值的幂是有符号的值;而无符号值的幂是无符号的值。
无符号值的一元负值是无符号的值。
无符号操作数可以与实数、复数操作数任意混合使用。(无符号操作数不能与区间操作数混合使用。)
可以使用内部关系运算来比较有符号和无符号整型操作数。其结果基于未修改的操作数的值。
CASE 构造接受无符号整数作为条件表达式。
不允许将无符号整数作为 DO 循环控制变量,也不允许在算术 IF 控制表达式中使用它。
可以使用 I、B、O 和 Z 编辑描述符来读取和写入无符号整数。
还可使用列表式 I/O 和名称列表 I/O 读取和写入无符号整数。列表式 I/O 或名称列表 I/O 下的无符号整数的写入格式与带符号的正整数使用的格式相同。
也可以使用未格式化 I/O 读取或写入无符号整数。
允许在内部函数中使用无符号整数,但 SIGN 和 ABS 除外。
新的内部函数 UNSIGNED 与 INT 类似,但生成无符号类型的结果。格式为
UNSIGNED(v [,kind] ).
另一个新的内部函数 SELECTED_UNSIGNED_KIND( var) 返回 var 的种类参数。
内部函数不允许同时使用有符号整型操作数和无符号整型操作数,但 MAX 和 MIN 函数除外。仅当至少有一个 REAL 类型的操作数时,才允许这两个函数同时使用有符号整型操作数和无符号整型操作数。
无符号数组不能作为数组内部函数的参数。
此发行版的 Solaris Studio Fortran 编译器中引入了 Fortran 2003 标准中的许多新功能。有关详细信息,请参阅 Fortran 2003 标准。同时也引入了 Fortran 2008 草案标准中所建议的一些功能。有关这些功能的详细信息,请参见相应的草案出版物。
新的 Fortran 标准提供了以下内容:
一种引用 C 语言过程的方法(相反的功能是,一种指定可从 C 函数中引用 Fortran 子程序的方法),以及
一种声明与外部 C 变量相链接的全局变量的方法
ISO_C_BINDING 模块提供了对命名常量的访问,这些命名常量是种类类型参数,它们代表了与 C 类型兼容的数据。
该标准还引入了 BIND(C) 属性。如果 Fortran 派生类型具有 BIND 属性,则它可以与 C 之间进行互操作。
此发行版的 Fortran 编译器实现了该标准第 15 章中描述的这些功能。如标准中第 4 章所述,Fortran 还提供了用于定义与 C 类型对应的派生类型和枚举的工具。
在 Fortran 语言中,新的内部模块 IEEE_ARITHMETIC 和 IEEE_FEATURES 提供了对异常和 IEEE 算法的支持。对这些功能提供完整支持的是:
USE, INTRINSIC :: IEEE_ARITHMETIC
USE, INTRINSIC :: IEEE_FEATURES
INTRINSIC 关键字是 Fortran 2003 中的新增功能。这些模块定义了一组派生类型、常量、舍入模式、查询函数、基本函数、种类函数、基本和非基本子例程。有关详细信息,请参见 Fortran 2003 标准的第 14 章。
Fortran 2003 标准引入了三个新的内部函数,用来处理命令行参数和环境变量。包括:
GET_COMMAND(command, length, status)
以 command 返回调用该程序的整个命令行。
GET_COMMAND_ARGUMENT(number, value, length, status)
以 value 返回命令行参数。
GET_ENVIRONMENT_VARIABLE(name, value, length, status, trim_name)
返回环境变量的值。
现在,Fortran 编译器接受 Fortran 2003 的 PROTECTED 属性。PROTECTED 对模块实体的使用进行了限制。具有 PROTECTED 属性的对象只能在声明这些对象的模块中定义。
编译器可识别 I/O 语句中的 ASYNCHRONOUS 说明符:
ASYNCHRONOUS=[’YES’ | ’NO’]
此语法是在 Fortran 2003 标准第 9 章中提出的。在与 WAIT 语句结合使用的情况下,允许程序员指定可能与计算重叠的 I/O 进程。虽然编译器可以识别 ASYNCHRONOUS=’YES’,但标准不要求实际的异步 I/O。在本发行版的编译器中,I/O 始终是同步的。
Fortran 2003 扩展了 ALLOCATABLE 属性所允许的数据实体。以前,仅限本地存储的数组变量使用该属性。现在,允许将它用于:
结构的数组组件
哑元数组
数组函数结果
在可分配实体可能与存储关联的所有位置,仍然禁止使用可分配实体: COMMON 块和 EQUIVALENCE 语句。可分配数组组件可以以 SEQUENCE 类型出现,但在 COMMON 和 EQUIVALENCE 中禁止使用此类型的对象。
f95 编译器接受 Fortran 2003 VALUE 类型声明属性。
如果使用此属性指定子程序哑元输入参数,则表明“按值”传递实际参数。以下示例说明如何将 VALUE 属性用于一个 C 主程序,该主程序将文字值作为参数来调用 Fortran 子程序:
C code: #include <stdlib.h> int main(int ac, char *av[]) { to_fortran(2); } Fortran code: subroutine to_fortran(i) integer, value :: i print *, i end |
Fortran 2003 标准定义了一个新的“流”I/O 方案。流 I/O 访问将数据文件作为可按从 1 开始的正整数编址的持续字节序列来处理。可以连接数据文件用于有格式访问或无格式访问。
可以在 OPEN 语句中使用 ACCESS='STREAM' 说明符来声明流 I/O 文件。字节地址文件定位要求 READ 或 WRITE 语句中有 POS=scalar_integer_expression 说明符。INQUIRE 语句接受 ACCESS=’STREAM’、说明符 STREAM=scalar_character_variable 和 POS=scalar_integer_variable。
在 f95 中,已实现了三个新的 Fortran 2003 格式化 I/O 说明符。它们可以出现在 OPEN、READ、WRITE、PRINT 和 INQUIRE 语句中:
DECIMAL=[’POINT’|’COMMA’]
更改缺省的十进制编辑模式。对于使用 D、E、EN、ES、F 和 G 编辑格式的浮点数,缺省使用句点来分隔整数和小数部分。'COMMA' 更改缺省设置以使用逗号而不是句点来打印,例如 123,456。缺省设置为 'POINT',即使用句点来打印,例如 123.456。
ROUND=[’PROCESSOR_DEFINED’ | ’COMPATIBLE’]
为格式化 I/O D、E、EN、ES、F 和 G 编辑设置缺省舍入模式。如果使用 'COMPATIBLE',数据转换后的值是与两个近似值较近的那个值,如果值正好在两者中间,则是离 0 远的值。如果使用 'PROCESSOR_DEFINED',舍入模式取决于处理器的缺省模式,如果未指定 ROUND,则为编译器缺省设置。
例如,WRITE(*,’(f11.4)’) 0.11115 在缺省模式下打印 0.1111,而在 'COMPATIBLE' 模式下打印 0.1112。
IOMSG=character-variable
将错误消息作为字符串在指定字符变量中返回。这与标准输出中显示的错误消息相同。用户应该分配足够大的字符缓冲区以保存最长的消息。(CHARACTER*256 应该足够了。)
在 INQUIRE 语句中使用时,这些说明符声明一个字符变量以返回当前值。
新的编辑描述符 DP、 DC、RP 和 RC 将单个 FORMAT 语句中的缺省设置分别更改为小数点、小数逗号、处理器定义的舍入以及兼容的舍入。例如:
WRITE(*,’(I5,DC,F10.3)’) N, W
在 F10.3 输出项中打印逗号而不是句点。
要了解如何更改格式化 I/O 的浮点舍入模式,另请参见 -iorounding 编译器命令行选项。(3.4.45 –iorounding[={ compatible|processor-defined}])
IMPORT 语句指定主机作用域单元中可由主机关联访问的实体。仅在接口主体中允许使用。
f95 编译器接受 Fortran 2003 FLUSH 语句。FLUSH 语句使写入外部文件的数据可用于其他进程;通过除 Fortran 以外的其他方法使外部文件中的数据可用于 READ 语句。
现在,Fortran 编译器支持 POINTER 哑元参数的 INTENT 属性:可以为指针 dummy 指定 INTENT(IN)、INTENT(OUT) 或 INTENT(INOUT)。
例如,
subroutine sub(P) integer, pointer, intent(in) :: p ... end |
指针的 INTENT 属性应用于指针,而非指针所指向的元素,因此对于 INTENT(IN) 指针,以下语句是非法的,因为这些语句将修改指针:
p => t allocate(p) deallocate(p) |
但以下语句对于 INTENT(IN) 指针是合法的,因为它修改指针所指向的元素:
p = 400 |
数组构造函数中允许使用方括号代替 (/ 和 /):
X = [ 3.2, 4.01, 6.5 ] |
Fortran 2003 标准允许使用方括号作为数组构造函数。这可能会与区间常量冲突。如果在不带 -xia 选项(或用于启用区间运算的类似选项)的情况下使用方括号,这些方括号将被视为数组构造函数。如果使用 -xia 选项,这些方括号将被视为常量。区间用户应继续使用 (/ 和 /) 数组构造函数,以避免出现编译错误。
有关下列 Fortran 2003 功能的详细信息,请参阅已发布的 Fortran 2003 标准。发布的 Fortran 200x 草案文档中介绍了 Fortran 2008 的功能。
2003 对可分配数组的扩展-赋值重新分配及可分配的标量
2003 对 ALLOCATE/DEALLOCATE 语句的扩展- ERRMSG 和 SOURCE
2003 对 MOVE_ALLOC 内部函数的扩展
2003 对带重映射的指针赋值的扩展
2003 扩展:MIN/MAX、MIN/MAXVAL 和 MIN/MAXLOC,使用字符参数。
2003 内部函数 IS_IOSTAT_END、IS_IOSTAT_EOR、NEW_LINE
2003 内部函数 SELECTED_CHAR_KIND
内部函数 SYSTEM_CLOCK 的 COUNT_RATE 参数的 2003 REAL 类型
2003 对复合 SQRT 内部函数结果的新限制
2008:使用空指针作为缺少的可选参数
x86 平台上的 IEEE 内部模块支持。
2008 的位内部函数:BGE, BGT, BLE, BLT, DSHIFTL, DSHIFTR, LEADZ, POPCNT, POPPAR, TRAILZ, MASKL, MASKR, SHIFTA, SHIFTL, SHIFTR, MERGE_BITS, IALL, IANY, IPARITY
本节介绍一些 Fortran 95 输入/输出处理扩展,f95 编译器接受这些扩展,但它们不是 Fortran 2003 标准的一部分。某些扩展是在 Fortran 77 编译器 f77 中出现的 I/O 扩展,现在这些扩展已成为 Fortran 编译器的一部分。
通过两个新函数,用户可以为逻辑单元上的格式化输入指定自己的错误处理例程。当检测到格式错误时,运行时 I/O 库会调用指定的由用户提供的处理程序例程,同时将数据指向输入行中导致错误的字符。处理程序例程可以提供一个新字符,并允许 I/O 操作在检测到错误的点上使用新字符继续运行;或者采用缺省的 Fortran 错误处理操作。
新例程 SET_IO_ERR_HANDLER(3f) 和 GET_IO_ERR_HANDLER(3f) 是模块子例程,这两个例程要求在调用它们的例程中使用 USE SUN_IO_HANDLERS。要详细了解这些例程,请参见手册页。
Fortran 77 允许用尖括号括起的任意表达式来代替具有某种格式的任何整数常量:
1 FORMAT( … < expr > … )
变量格式表达式不能作为 nH… 编辑描述符中的 n 出现在 ASSIGN 语句引用的 FORMAT 语句中,或者出现在并行区域内的 FORMAT 语句中。
这种功能是在 f95 中自动启用的,并且不要求使用-f77 兼容性选项标志。
输入中的组名前面可以是 $ 或 &。& 是 Fortran 95 标准接受的唯一格式,并且是 NAMELIST 输出所写入的内容。
接受 $ 作为用来终止输入的符号,但以下情况除外:组中最后一个数据项是 CHARACTER 数据,此时将 $ 作为输入数据处理。
允许 NAMELIST 输入从记录的第一列开始。
使用 FORM=’BINARY’ 打开文件与使用 FORM=’UNFORMATTED’ 具有大致相同的效果,所不同的是文件中没有嵌入记录长度。如果没有此数据,则无法知道一条记录的开始或结束位置。因此,无法对 FORM=’BINARY’ 文件执行 BACKSPACE 操作,这是因为不知道要退格到什么位置。对 ’BINARY’ 文件执行 READ 操作时,将按需要读取尽可能多的数据来填充输入列表中的变量。
WRITE 语句: 以二进制的形式将数据写入文件,并按输出列表中指定的数量传输字节。
READ 语句: 将数据读取到输入列表中的变量,并传输该列表所要求数量的字节。因为文件中没有记录标记,所以不进行“记录结束”错误检测。检测到的唯一错误是“文件结束”或异常系统错误。
INQUIRE 语句:对使用 FORM="BINARY" 打开的文件执行 INQUIRE 返回:
FORM=”BINARY”ACCESS=”SEQUENTIAL”DIRECT=”NO”FORMATTED=”NO”UNFORMATTED=”YES”RECL= AND NEXTREC= are undefined
BACKSPACE 语句: 不允许使用-返回一个错误。
ENDFILE 语句: 在当前位置照常截断文件。
REWIND 语句: 将文件照常重新定位到数据的开头。
在不同单元上可能出现的递归 I/O(这是因为 f95 I/O 库为 "MT-Warm")。
RECL=2147483646 (231-2) 是顺序格式化输出、列表式输出和名称列表输出中的缺省记录长度。
可以按《FORTRAN 77 Language Reference》手册中所述识别和实现 ENCODE 和 DECODE。
非前进式 I/O 是使用 ADVANCE='NO' 启用的,如下所示:
write(*,’(a)’,ADVANCE=’NO’) ’n= ’ read(*,*) n
编译器指令指示编译器执行某些特殊的操作。指令又称 pragma。
可以将编译器指令作为一个或多个文本行插入到源程序中。每一行看起来就像注释一样,但其中包含的其他字符可将其标识为不仅仅是该编译器的注释。对于大多数其他编译器,它被处理为注释,因此具有一定的代码移植性。
有关 Fortran 指令的完整摘要,请参见附录 C。
除了1.8 命令行帮助中介绍的指令外,f95 还可识别其自己的特殊指令。这些指令使用以下语法:
!DIR$ d1, d2, … |
将后跟空格的 !DIR$ 放在行中的任意位置。
!DIR$ 字符是行中的第一个非空字符(实际上就是非空白)。
指令在空格后面列出。
在初始指令行中,紧跟在 !DIR$ 之后的位置中为空格、制表符或换行符。
在连续指令行中,紧跟在 !DIR$ 之后的位置中为空格、制表符或换行符以外的字符。
因此,第 1 至第 5 列中的 !DIR$ 既用于自由格式源代码又用于固定格式源代码。
这些指令指定指令行后面行的源代码格式。
它们适用于所在文件的其余部分,或者在遇到下一个 FREE 或 FIXED 指令之前的部分。
它们用于切换源文件中的源代码格式。
它们用于切换 INCLUDE 文件的源代码格式。您可以将指令插入在 INCLUDE 文件的开头。在处理 INCLUDE 文件后,源代码格式恢复为处理 INCLUDE 文件之前使用的格式。
每个指令必须单独出现在编译器指令行中(没有续行)。
每个指令可以出现在源代码中的任意位置。其他指令必须出现在它们所影响的程序单元中。
示例: 一个 FREE 指令。
!DIR$ FREE DO i = 1, n a(i) = b(i) * c(i) END DO |
并行化指令是一种特殊的注释,它指示编译器尝试并行处理下一个 DO 循环。附录 D 中对这些指令进行概述,《Fortran 编程指南》中有关并行化的一章介绍了这些指令。Sun 和 Cray 样式并行化指令现已过时,应首选使用 OpenMP Fortran API 指令和并行化模型。《OpenMP API 用户指南》中介绍了 OpenMP 并行化。
在编译包含 Fortran 95 MODULE 的文件时,会为在源代码中遇到的每个 MODULE 生成模块接口文件(.mod 文件)。文件名是从 MODULE 的名称中派生的;将为 MODULE xyz 创建文件 xyz.mod(全部小写)。
编译还会为包含 MODULE 语句的源文件生成 .o 模块实现目标文件。可与模块实现目标文件以及所有其他目标文件链接在一起以创建可执行文件。
编译器在 -moddir=dir 标志或 MODDIR 环境变量指定的目录中创建模块接口文件和实现目标文件。如果没有指定,则编译器在当前工作目录中写入 .mod 文件。
在编译 USE modulename 语句时,编译器在当前工作目录中查找接口文件。使用 - Mpath 选项,可以为编译器指定其他搜索路径。必须在链接步骤的命令行中显式列出模块实现目标文件。
通常,程序员为每个文件定义一个 MODULE,并为 MODULE 及包含它的源文件指定相同的名称。但是,这并不是必需的。
在本示例中,同时编译所有的文件。模块源文件在主程序使用它们之前就已出现。
demo% cat mod_one.f90 MODULE one ... END MODULE demo% cat mod_two.f90 MODULE two ... END MODULE demo% cat main.f90 USE one USE two ... END demo% f95 -o main mod_one.f90 mod_two.f90 main.f90 |
编译创建以下文件:
mainmain.oone.modmod_one.otwo.modmod_two.o
下一个示例单独编译每个单元,并将它们链接在一起。
demo% f95 -c mod_one.f90 mod_two.f90 demo% f95 -c main.f90 demo% f95 -o main main.o mod_one.o mod_two.o |
在编译 main.f90 时,编译器在当前目录中搜索 one.mod 和 two.mod。必须先编译这些文件,再编译在 USE 语句中引用模块的任何文件。链接步骤要求模块实现目标文件 mod_one.o 和 mod_two.o 与所有其他目标文件一起出现,以创建可执行文件。
在发行的 7.0 版的 Fortran 编译器中,可以将 .mod 文件存储在归档 (.a) 文件中。要在归档中搜索模块,必须在命令行的 -Mpath 标志中显式指定它。在缺省情况下,编译器并不搜索归档文件。
仅搜索与 USE 语句中出现的名称同名的 .mod 文件。例如,Fortran 语句 USE mymod 使编译器缺省搜索模块文件 mymod.mod。
在搜索过程中,编译器为在其中写入模块文件的目录指定更高的优先级。可以使用 -moddir=dir 选项标志和 MODDIR 环境变量对此进行控制。这意味着,如果仅指定了 -Mpath 选项,则首先搜索当前目录,然后再搜索 -M 标志上列出的目录和文件。
-use=list 标志强制将一个或多个隐式 USE 语句添加到每个使用该标志编译的子程序或模块子程序中。通过使用该标志,使得在库或应用程序的某个功能要求使用模块或模块文件时,不必修改源程序。
使用 -use=module_name 进行编译,可将 USE module_name 语句添加到正在编译的每个子程序或模块中。使用 -use=module_file_name 进行编译,与为 module_file_name 文件中包含的每个模块添加 USE module_name 具有相同的效果。
使用 fdumpmod(1) 命令可显示有关已编译模块信息文件的内容的信息。
demo% fdumpmod x.mod group.mod x 1.0 v8,i4,r4,d8,n16,a4 x.mod group 1.0 v8,i4,r4,d8,n16,a4 group.mod |
fdumpmod 命令将在单个 .mod 文件、通过串联 .mod 文件形成的文件以及 .mod 文件的 .a 归档中显示有关模块的信息。显示的内容包含模块名称、版本号、目标体系结构,以及用来指示与模块兼容的编译选项的标志。有关详细信息,请参见 fdumpmod(1) 手册页。
名称 |
定义 |
函数类型 |
参数类型 |
参数 |
说明 |
---|---|---|---|---|---|
COT |
余切 |
实型 |
实型 |
([X=]x) |
P, E |
DDIM |
正偏差 |
双精度 |
双精度 |
([X=]x,[Y=]y) |
P, E |
Notes: P: 名称可以作为参数传递。E: 在运行时调用内部函数的外部代码。
有关内部函数(包括 Fortran 编译器可识别的 Fortran 77 内部函数)的更完整论述,请参见《Fortran 库参考》。
不能保证此发行版的 f95 所生成的模块信息文件与以后的发行版兼容。
可以将使用 C 编写的例程与 Fortran 程序结合使用 ,因为这些语言具有通用的调用约定。有关 C 和 Fortran 例程之间如何进行交互操作的详细信息,请参见《Fortran 编程指南》的“C/Fortran 接口”一章。