定义派生数据类型数组的默认值
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_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)]
如果要使用结构构造函数构造数组,请注意您需要一个数组构造函数:结构构造函数.
更一般地说,我们可以使用默认结构构造函数以外的东西,但表达式必须是常量表达式.
提供一个适合问题的例子:
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
在 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_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)]
如果要使用结构构造函数构造数组,请注意您需要一个数组构造函数:结构构造函数
更一般地说,我们可以使用默认结构构造函数以外的东西,但表达式必须是常量表达式.
提供一个适合问题的例子:
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