类型

用途

TYPE 类型声明语句指定派生类型的对象和函数的类型,类型参数和属性。 可以为对象赋予初始值。

Fortran 2008 开始类型声明语句可以声明派生类型和固有类型的实体。 TYPE类型声明语句可以声明派生类型和固有类型的实体。 Fortran 2008 结束

语法

读取语法图跳过可视语法图TYPE( 内部类型规范 (intrinsic_type_spec)1派生类型规范 ) ::,attr_spec_list:: entity_decl_list
备注信息:
  • 1 Fortran 2008
其中:
Fortran 2008 开始固有类型说明Fortran 2008 结束
是内部数据类型的名称。 有关更多信息,请参阅 内部数据类型
derived_type_spec
是可扩展派生类型的名称。 有关更多信息,请参阅 类型声明

Fortran 2003 开始 派生类型不能是抽象的。 Fortran 2003 结束

::
是双冒号分隔符。 如果指定了属性,使用了 = constant_expr=>NULL() 显示为任何 entity_decl的一部分,那么这是必需的。
attr_spec
是下列任何属性。 有关特定属性规则的详细信息,请参阅同一名称的语句。
ALLOCATABLE 1 INTRINSIC PUBLIC
ASYNCHRONOUS OPTIONAL SAVE
AUTOMATIC 2 PARAMETER STATIC 2
BIND 1 POINTER TARGET
DIMENSION (array_spec) PRIVATE VALUE 1
EXTERNAL PROTECTED 1 VOLATILE
INTENT (intent_spec)    
注意:
  • 1 Fortran 2003
  • 2 IBM 扩展
其中:
array_spec
是维度边界的列表。
intent_spec
INOUTINOUT之一。
entity_decl
读取语法图跳过可视语法图a (数组规范) /initial_value_list/1 = constant_expr => NULL()
备注信息:
  • 1 IBM 扩展
其中:
a
是对象名或函数名。 不能为具有隐式接口的函数指定 array_spec
IBM 扩展开始初始值 IBM 扩展结束
为紧邻的前一个名称所指定的实体提供初始值。 如 DATA中所述进行初始化。
constant_expr
为紧邻的前一个名称所指定的实体提供常量表达式。
=> NULL()
为指针对象提供初始值。

规则

在派生类型定义的上下文中:
  • 如果 => 出现在组件初始化中,那么 POINTER 属性必须出现在 attr_spec_list中。
  • 如果 = 出现在组件初始化中,那么 POINTER 属性无法出现在组件 attr_spec_list中。
  • 编译器将在类型定义的作用域单元内对 constant_expr 求值。

如果变量出现 => ,那么对象必须具有 POINTER 属性。

如果针对变量显示 constant_expr ,那么对象不能具有 POINTER 属性。

类型声明语句中的实体会受到对实体指定的任何属性规则的约束,如对应的属性语句中所详述。

一旦定义了派生类型,您就可以使用它通过 TYPE 类型声明语句来定义数据项。 当实体被显式声明为派生类型时,该派生类型必须先前已在作用域单元中定义,或可通过使用或主机关联进行访问。

数据对象变为派生类型的对象结构。 每个结构组件都是派生类型对象的子对象。

如果指定 DIMENSION 属性,那么将创建其元素具有该派生类型的数据类型的数组。

除了在规范语句中,您可以将派生类型的对象用作实际参数和哑参数,并且这些对象也可以显示为输入/输出列表中的项 (除非该对象具有具有 POINTER 属性的组件) ,赋值语句,结构构造函数以及语句函数定义的右侧。 如果结构组件不可访问,那么派生类型对象不能在输入/输出列表中使用,也不能用作结构构造函数。

非序列派生类型的对象不能用作 EQUIVALENCECOMMON 语句中的数据项。 非序列数据类型的对象不能是整数所指对象。

非序列派生类型哑参数必须指定一个可通过使用或主机关联来访问的派生类型,以确保同一派生类型定义同时定义实际自变量和哑参数。

类型声明语句将覆盖正在生效的隐式类型规则。

如果对象是哑参数、可分配对象、函数结果、空白公共块中的对象、整数指针、外部名称、固有名称或自动对象,那么不能在类型声明语句中初始化对象。 如果对象具有 AUTOMATIC 属性,那么也无法初始化该对象。 如果对象出现在块数据程序单元 IBM 扩展开始 中的命名公共块中,或者出现在模块或子模块IBM 扩展结束 中的命名公共块中,则可以对它进行初始化。

在 Fortran 95 中,可以初始化指针。 只能通过使用 => NULL()来初始化指针。

如果规范表达式出现在接口主体或子程序的规范部分中,那么 array_spec 的规范表达式可以是非常量表达式。 任何使用此非常量表达式且不是哑参数或所指对象的被声明对象都称为自动对象

属性不能在给定类型声明语句中重复,并且在一个作用域单元中,一个实体不能被多次显式赋予同一个属性。

如果语句包含 PARAMETER 属性,那么必须指定 constant_expr 。 如果要声明的实体是变量,并且指定了 constant_exprNULL() ,那么初始定义该变量。

如果要声明的实体是派生类型组件,并且指定了 constant_exprNULL() ,那么派生类型具有缺省初始化。

a 将根据固有赋值规则,通过 constant_expr 确定的值进行定义。 如果实体是数组,那么其形状必须在类型声明语句中指定,或在同一作用域单元中的先前规范语句中指定。 变量或变量子对象最多只能初始化一次。 如果 a 是变量,那么存在 constant_expr NULL() 意味着 a 是已保存的对象 (指定公共块中的对象除外)。 对象的初始化可能会影响对象的基本存储类。

entity_decl 中指定的 array_spec 优先于 DIMENSION 属性中的 array_spec

没有 ALLOCTABLEPOINTER 属性的数组函数结果必须具有显式形状数组规范。

如果声明的实体是函数,那么除非它是固有函数,否则不得具有可访问的显式接口。 可以在 FUNCTION 语句上指定派生类型,前提是派生类型在函数主体中定义,或者可通过主机或使用关联进行访问。

IBM 扩展开始 如果 或 (之前定义为常量名称)出现在类型声明语句中,它不再是简写的逻辑常量,而是已命名常量的名称。 T F IBM 扩展结束

示例 1

以下代码使用 TYPE 类型声明语句定义派生类型 people
TYPE people                      
  INTEGER age
  CHARACTER*20 name
END TYPE people
以下语句声明派生类型为 people的名为 smith 的实体:
TYPE(people) :: smith = people(25,'John Smith')
Fortran 2008 开始

示例 2

此示例演示了如何使用 TYPE() 类型说明符来声明内部类型的实体。
TYPE(INTEGER) :: i
TYPE(INTEGER(KIND=2)) :: i2
TYPE(INTEGER(4)) :: i4

TYPE(CHARACTER(*)) :: cstar
TYPE(CHARACTER*2) :: c2
TYPE(CHARACTER(LEN=4,KIND=1)) :: c4
TYPE(CHARACTER(7)) :: c7

TYPE derived(l)
  TYPE(INTEGER), LEN :: l
  TYPE(CHARACTER*l) :: cl
  TYPE(COMPLEX), DIMENSION (l) :: cp
END TYPE derived
Fortran 2008 结束

相关信息