了解 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 

我有以下问题:

  1. 数组的每个派生类型变量中哪个值默认会有high/low个变量?即,它们是否默认初始化为 0?这取决于编译器还是由标准强制执行?

  2. 如果在模块中定义派生类型和数组怎么办?它有什么改变吗?

  3. 如果我想将整个数组high/low的值初始化为-1?哪种方法最简单?

如果这取决于编译器,那么我使用的是 gfortran (gcc8)。

  1. 没有特定的价值保证。值未定义。您的编译器可能会承诺某些特定值,但它不可移植。

  2. 完全没有改变。

  3. 默认组件初始化

:

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 属性。默认初始化没有。