此发行版的 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