Oracle® Developer Studio 12.5:Fortran 用户指南

退出打印视图

更新时间: 2016 年 6 月
 
 

4.6 Fortran 200x 功能

Oracle Developer Studio Fortran 编译器的此发行版中引入了 Fortran 2003 和 Fortran 2008 标准中的许多新功能。有关详细信息,请参阅相应的 Fortran 标准。

4.6.1 与 C 之间的互操作性

新的 Fortran 标准提供了以下内容:

  • 一种引用 C 语言过程的方法(相反的功能是,一种指定可从 C 函数中引用 Fortran 子程序的方法)

  • 一种声明与外部 C 变量相链接的全局变量的方法

ISO_C_BINDING 模块提供了对命名常量的访问,这些命名常量是种类类型参数,它们代表了与 C 类型兼容的数据。

该标准还引入了 BIND(C) 属性。如果 Fortran 派生类型具有 BIND 属性,则它可以与 C 之间进行互操作。

Fortran 编译器实现了 Fortran 标准第 15 章中介绍的功能。第 15 章中定义的所有内部函数均已实现。如标准中第 4 章所述,Fortran 还提供了用于定义与 C 类型对应的派生类型和枚举的工具。

4.6.2 IEEE 浮点异常处理

在 Fortran 语言中,新的内部模块 IEEE_ARITHMETICIEEE_FEATURES 提供了对异常和 IEEE 算法的支持。对这些功能提供完整支持的是:

USE, INTRINSIC :: IEEE_ARITHMETIC

USE, INTRINSIC :: IEEE_FEATURES

INTRINSIC 关键字是 Fortran 2003 中的新增功能。这些模块定义了一组派生类型、常量、舍入模式、查询函数、基本函数、种类函数、基本和非基本子例程。有关详细信息,请参见 Fortran 2003 标准的第 14 章。

4.6.3 命令行参数内部函数

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)

    返回环境变量的值。

4.6.4 PROTECTED 属性

现在,Fortran 编译器接受 Fortran 2003 的 PROTECTED 属性。PROTECTED 对模块实体的使用进行了限制。具有 PROTECTED 属性的对象只能在声明这些对象的模块中定义。

4.6.5 Fortran 2003 异步 I/O

编译器可识别 I/O 语句中的 ASYNCHRONOUS 说明符:

ASYNCHRONOUS=[’YES’ | ’NO’]

此语法是在 Fortran 2003 标准第 9 章中提出的。在与 WAIT 语句结合使用的情况下,允许程序员指定可能与计算重叠的 I/O 进程。虽然编译器可识别 ASYNCHRONOUS=’YES’,但此标准不需要实际的异步 I/O。在编译器的此发行版中,I/O 始终是同步的。

4.6.6 扩展的 ALLOCATABLE 属性

Fortran 2003 扩展了 ALLOCATABLE 属性所允许的数据实体。以前,仅限本地存储的数组变量使用该属性。现在,允许将它用于:

  • 结构的数组组件

  • 哑元数组

  • 数组函数结果

  • CLASS 类型说明符中的多态实体

在可分配实体可能与存储关联的所有位置,仍然禁止使用可分配实体:COMMON 块和 EQUIVALENCE 语句。可分配数组组件可以以 SEQUENCE 类型出现,但在 COMMONEQUIVALENCE 中禁止使用此类型的对象。

4.6.7 VALUE 属性

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

4.6.8 Fortran 2003 流 I/O

Fortran 2003 标准定义了一个新的“流”I/O 方案。流 I/O 访问将数据文件作为可按从 1 开始的正整数编址的持续字节序列来处理。可以连接数据文件用于有格式访问或无格式访问。

可以在 OPEN 语句中使用 ACCESS='STREAM' 说明符来声明流 I/O 文件。字节地址文件定位要求 READWRITE 语句中有 POS=scalar_integer_expression 说明符。INQUIRE 语句接受 ACCESS=’STREAM’、说明符 STREAM=scalar_character_variablePOS=scalar_integer_variable

4.6.9 Fortran 2003 IMPORT 语句

IMPORT 语句指定主机作用域单元中可由主机关联访问的实体。仅在接口主体中允许使用。

4.6.10 Fortran 2003 FLUSH I/O 语句

f95 编译器接受 Fortran 2003 FLUSH 语句。 FLUSH 语句使写入外部文件的数据可用于其他进程;通过除 Fortran 以外的其他方法使外部文件中的数据可用于 READ 语句。

4.6.11 Fortran 2003 POINTER INTENT 功能

现在,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

4.6.12 Fortran 2003 中增强的数组构造函数

数组构造函数中允许使用方括号代替 (//)

X = [ 3.2, 4.01, 6.5 ]

Fortran 2003 标准允许使用方括号作为数组构造函数。这可能会与区间常量冲突。如果在不带 -xia 选项(或用于启用区间运算的类似选项)的情况下使用方括号,这些方括号将被视为数组构造函数。如果使用 -xia 选项,这些方括号将被视为常量。区间用户应继续使用 (/ /) 数组构造函数,以避免出现编译错误。

数组构造函数中的数组组件可以具有以下两种格式:

type-spec ::

[type-spec ::] ac-value-list

当提供了可选的 type-spec 时,各个数组组件的类型和种类不必相同,只要数组组件的类型符合 type-spec 即可。

type-spec 可以是内部类型或派生类型。

4.6.13 面向对象的 Fortran 支持

Fortran 2003 提供了对多态性的完整支持。

4.6.14 FINAL 子例程支持

支持 FINAL 子例程,这是一种 Fortran 2003 功能。

4.6.15 过程指针支持

支持过程指针,这是一种 Fortran 2003 功能。

4.6.16 其他 Fortran 2003 和 Fortran 2008 功能

有关详细信息,请参阅已发布的 Fortran 2003 和 Fortran 2008 标准。

  • 2003 对可分配数组的扩展-赋值重新分配及可分配的标量。

  • 2003 对 ALLOCATE/DEALLOCATE 语句的扩展-ERRMSGSOURCE

  • 2003 对 MOVE_ALLOC 内部函数的扩展。

  • 2003 对带重映射的指针赋值的扩展。

  • 2003 扩展:MIN/MAXMIN/MAXVAL MIN/MAXLOC,使用字符参数。

  • 2003 内部函数 IS_IOSTAT_END、IS_IOSTAT_EOR、NEW_LINE

  • 2003 内部函数 SELECTED_CHAR_KIND

  • 内部函数 SYSTEM_CLOCKCOUNT_RATE 参数的 2003 REAL 类型。

  • 2003 对复合 SQRT 内部函数结果的新限制。

  • 2008:使用空指针作为缺少的可选参数。

  • 2008 的位内部函数:BGE, BGT, BLE, BLT, DSHIFTL, DSHIFTR, LEADZ, POPCNT, POPPAR, TRAILZ, MASKL, MASKR, SHIFTA, SHIFTL, SHIFTR, MERGE_BITS, IALL, IANY, IPARITY

  • 增强的结构构造函数:使用组件名称构造结构常量。

  • 模块派生类型和组件上的增强 PUBLIC/PRIVATE 访问控制。

  • 更多 Fortran 2008 数学内部函数支持。在 x86 平台上,除了 ERFC_SCALED、NORM2 以及某些 REAL*16 变量外,现在多数 Fortran 2008 数学内部函数都受支持。

  • 不带组件的派生类型。

  • KIND 参数已添加到 ICHAR、IACHAR、ACHAR、SHAPE、UBOUND、LBOUND、SIZE、MINLOC、MAXLOC、COUNT、 LEN、LEN_TRIM、INDEX、SCAN VERIFY 内部函数中。

  • BACK 参数已添加到 MINLOCMAXLOC 内部函数中。

  • 添加了新的内部函数 FINDLOCSTORAGE_SIZE

  • 新的关键字 ERRMSG、SOURCEMOLD 已添加到 ALLOCATE 语句中,ERRMSG 已添加到 DEALLOCATE 语句中。

  • 使用 ENUM 进行枚举。

  • VOLATILE 关键字。

  • 各组件上的 PUBLIC/PRIVATE 可访问性。

  • 专用类型的公共实体。

  • 增强的复数常量。

  • Fortran 2003 ISO_FORTRAN_ENV 模块。

  • 内部函数的新可选参数 KIND=

  • 名称的长度最长可为 127 个字符,但模块名称除外(它的长度不能超过 31 个字符)。

  • INQUIRE 语句中的 ID= PENDING= 说明符。

  • 数据传送和 INQUIRE 语句中的 POS= 说明符。

  • BLANK、DECIMAL、DELIM、PAD、ROUND、SIZE 说明符。

  • DC、DP、RD、RC、RN、RP、RU、RZ 编辑描述符。

  • USE 中的 INTRINSICNON_INTRINSIC 关键字。

  • IS_IOSTAT_ENDIS_IOSTAT_EOR 内部函数。

  • 对延迟长度字符声明的支持。例如,CHARACTER (LEN=:)、POINTER :: STR

  • 支持将 TARGET 对象传递到 INTENT(IN) 指针哑元。这是一个 Fortran 2008 功能。