【问题标题】: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=0obj%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

【问题讨论】:

    标签: fortran derived-types


    【解决方案1】:

    首先是关于术语的注释:在这样的陈述中

    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)]
    

    如果要使用结构构造函数构造数组,注意需要数组构造函数:结构构造函数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
    

    【讨论】:

    • 美丽的答案。谢谢
    猜你喜欢
    • 2016-03-27
    • 2021-09-25
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2021-03-04
    • 2018-02-26
    相关资源
    最近更新 更多