了解 Fortran 如何初始化模块中定义的派生类型数组
Understanding how Fortran initializes arrays of derived type defined in a module
我有以下数组:
type bar
integer*4 :: high
integer*4 :: low
end type
type(bar), dimension(2000:2025, 12, 31, 0:23, 0:59) :: data
我有以下问题:
数组的每个派生类型变量中哪个值默认会有high/low个变量?即,它们是否默认初始化为 0?这取决于编译器还是由标准强制执行?
如果在模块中定义派生类型和数组怎么办?它有什么改变吗?
如果我想将整个数组high/low的值初始化为-1?哪种方法最简单?
如果这取决于编译器,那么我使用的是 gfortran (gcc8)。
没有特定的价值保证。值未定义。您的编译器可能会承诺某些特定值,但它不可移植。
完全没有改变。
默认组件初始化
:
type bar
integer*4 :: high = -1
integer*4 :: low = -1
end type
对于该类型的所有变量。
或者只初始化数组
type(bar), dimension(2000:2025, 12, 31, 0:23, 0:59) :: data = bar(-1, -1)
请注意,通常的陷阱适用,变量现在隐式 save
。但如果它是一个模块变量,它不会改变任何东西。如果是过程局部变量,要小心
请注意,整数的 *4
在 Fortran 90 中无效。它根本不是标准的 Fortran。
Fortran 中有两种初始化形式:显式 和默认 初始化。
在提供的代码片段中没有任何形式的初始化,因此数组data
没有初始值(部分或全部)。数组和组件最初是未定义的。
默认初始化看起来像
type bar
integer :: high = -1
integer :: low = -1
end type
在这种情况下,该形式的对象将具有这些组件的初始值,除非显式初始化覆盖它们
对象 array
的显式初始化看起来像
type(bar), ... :: array = expr
对于合适的(常量)表达式 expr
.
在您的例子中,标量常量表达式 bar(-1,-1)
使用默认结构构造函数来指定组件设置为这些值的对象。这是一个有效的常量表达式。然后使用标量表达式为数组的每个元素设置值。
这与上述默认初始化具有相同的效果,但更普遍的是可以提供其他值,我们可以为初始值提供(一致的)数组表达式。
默认和显式初始化可能会发生在模块或其他地方,而无需更改上述内容。
如 Vladimir F 的回答中所述,使用显式初始化为初始化对象提供 save
属性。默认初始化没有。
我有以下数组:
type bar
integer*4 :: high
integer*4 :: low
end type
type(bar), dimension(2000:2025, 12, 31, 0:23, 0:59) :: data
我有以下问题:
数组的每个派生类型变量中哪个值默认会有high/low个变量?即,它们是否默认初始化为 0?这取决于编译器还是由标准强制执行?
如果在模块中定义派生类型和数组怎么办?它有什么改变吗?
如果我想将整个数组high/low的值初始化为-1?哪种方法最简单?
如果这取决于编译器,那么我使用的是 gfortran (gcc8)。
没有特定的价值保证。值未定义。您的编译器可能会承诺某些特定值,但它不可移植。
完全没有改变。
默认组件初始化
:
type bar
integer*4 :: high = -1
integer*4 :: low = -1
end type
对于该类型的所有变量。
或者只初始化数组
type(bar), dimension(2000:2025, 12, 31, 0:23, 0:59) :: data = bar(-1, -1)
请注意,通常的陷阱适用,变量现在隐式 save
。但如果它是一个模块变量,它不会改变任何东西。如果是过程局部变量,要小心
请注意,整数的 *4
在 Fortran 90 中无效。它根本不是标准的 Fortran。
Fortran 中有两种初始化形式:显式 和默认 初始化。
在提供的代码片段中没有任何形式的初始化,因此数组data
没有初始值(部分或全部)。数组和组件最初是未定义的。
默认初始化看起来像
type bar
integer :: high = -1
integer :: low = -1
end type
在这种情况下,该形式的对象将具有这些组件的初始值,除非显式初始化覆盖它们
对象 array
的显式初始化看起来像
type(bar), ... :: array = expr
对于合适的(常量)表达式 expr
.
在您的例子中,标量常量表达式 bar(-1,-1)
使用默认结构构造函数来指定组件设置为这些值的对象。这是一个有效的常量表达式。然后使用标量表达式为数组的每个元素设置值。
这与上述默认初始化具有相同的效果,但更普遍的是可以提供其他值,我们可以为初始值提供(一致的)数组表达式。
默认和显式初始化可能会发生在模块或其他地方,而无需更改上述内容。
如 Vladimir F 的回答中所述,使用显式初始化为初始化对象提供 save
属性。默认初始化没有。