为派生数据类型的数组定义默认值
Posted
技术标签:
【中文标题】为派生数据类型的数组定义默认值【英文标题】:defining default values for an array of derived data type 【发布时间】:2022-01-17 23:54:43 【问题描述】:在 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
一切都非常简单。但是,用于为派生数据类型的所有数组条目定义一组默认值的语法是什么?我查了一些教程,但没有一个解决这个问题。换句话说,默认情况下j=0
在obj%j
的第一个元素中,并在第二个元素中设置为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
【问题讨论】:
【参考方案1】:首先是关于术语的注释:在这样的陈述中
integer, save :: i=1
这不为i
提供一个“默认”值,它为i 提供一个初始 值。我们称之为显式初始化。 (请注意,我如何将 SAVE 属性放在那里只是为了使其显而易见;该属性是隐式的。)
无论对象是内在类型还是派生类型、标量还是数组,这种显式初始化的语法都是相同的:
type(decl_type), save[, attributes] :: myobj = initial_expression
其中decl_type
是integer
、real
、my_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)]
如果要使用结构构造函数构造数组,注意需要数组构造函数:结构构造函数isn't elemental。
更一般地说,我们可以使用默认结构构造函数以外的东西,但表达式必须是常量表达式。
提供一个适合该问题的示例:
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
【讨论】:
美丽的答案。谢谢以上是关于为派生数据类型的数组定义默认值的主要内容,如果未能解决你的问题,请参考以下文章