定义派生数据类型数组的默认值

defining default values for an array of derived data type

在 fortran 中,您可以在声明时为变量定义默认值,稍后可以在代码中覆盖它,还可以为派生类型数组中的所有条目提供默认值,如下所示:

PROGRAM test
TYPE data
  INTEGER :: j=0
  CHARACTER(len=10)::label="hello"
END TYPE data
TYPE(data) :: obj(2)

! overwrite the default of 0 in the first array entry
obj(1)%j=6  ! etc etc

END PROGRAM test

一切都非常简单。但是,用于为派生数据类型的所有数组条目定义一组默认值的语法是什么?我查阅了一些教程,但其中 none 解决了这个问题。换句话说,默认情况下在 obj%j 的第一个元素中有 j=0 并在第二个元素中将其设置为 1 等等...

PROGRAM test

TYPE data
  INTEGER :: j
  CHARACTER(len=10)::label
END TYPE data

TYPE(data) :: obj(2)=??? ! what do I put to define an array of default types?

! for example these might be my desired default values
obj(1)%j=0
obj(1)%label="bad"
obj(2)%j=1
obj(2)%label="good"

END PROGRAM test

首先是关于术语的注释:在像

这样的语句中
integer, save :: i=1

这不为 i 提供“默认”值,它为 i 提供 初始 值。我们称之为 显式初始化 。 (请注意我如何将 SAVE 属性放在那里只是为了使其显而易见;该属性是隐式的。)

无论对象是固有类型还是派生类型、标量还是数组,这种显式初始化的语法都是相同的:

type(decl_type), save[, attributes] :: myobj = initial_expression

其中decl_typeintegerrealmy_type等(type(integer)当然可以写成简单的integer.)

对于派生类型,我们只需要找到合适的初始化表达式即可。

对于数组 myobj,此表达式可以是标量(在这种情况下,数组的所有元素最初都具有该值)或数组。明显的情况使用默认的结构体构造函数:

type(my_type), save               :: myobj1 = decl_type(comps)
type(my_type), save, dimension(2) :: myobj2 = decl_type(comps)
type(my_type), save, dimension(2) :: myobj3 = [decl_type(comps1), decl_type(comps2)]

如果要使用结构构造函数构造数组,请注意您需要一个数组构造函数:结构构造函数.

更一般地说,我们可以使用默认结构构造函数以外的东西,但表达式必须是常量表达式.

提供一个适合问题的例子:

implicit none

type data
  integer :: j
  character(10) :: label
end type data

type(data), save, dimension(2) :: mydata=[data(0,"bad"), data(1,"good")]

end

最后,如果派生类型有组件的默认初始化,它们可以从结构构造函数中省略:

implicit none

type data
  integer :: j=-1
  character(10) :: label="nothing"
end type data

type(data), save, dimension(2) :: mydata=data()

end