【问题标题】:using fortran derived type variable without %使用不带 % 的 fortran 派生类型变量
【发布时间】:2021-09-13 05:16:59
【问题描述】:

我定义了一个名为MATRIX的类型和一个名为A的变量,如下所示

TYPE MATRIX
    REAL, ALLOCATABLE, DIMENSION(:,:) :: MAT
END TYPE

TYPE(MATRIX) :: A

构造A然后使用它的常用方式是

ALLOCATE(A%MAT(2,2))

A%MAT(1,:) = [1,2]
A%MAT(2,:) = [3,4]

PRINT*, A%MAT

我想知道是否可以使用变量A 而无需编写A%MAT。换句话说,是否有任何解决方法可以将前面的代码块重写为以下形式(使用A 而不是A%MAT

ALLOCATE(A(2,2))

A(1,:) = [1,2]
A(2,:) = [3,4]

PRINT*, A

【问题讨论】:

  • 一种选择是使用parameterized derived type,因此您不需要可分配的数组成员。另一种选择是将已分配的数组作为参数传递给构造函数。甚至是自定义构造函数。
  • @RodrigoRodrigues 我认为这不能解决对% 语法的需求。 Masoud 可能正在寻找一些已定义的操作(自定义添加、分配、IO、inexing)。遗憾的是,在 Fortran 中无法重载索引。
  • 您可以使用构造函数一次性设置整个数组,或者适当地重载赋值运算符。但是你不能在没有 % 的情况下指定单个元素或切片,至少据我所知
  • 是的...print*, a 可以通过custom derived-type I/O 实现。对象初始化,你可以得到类似 a = matrix(2, 2) 的自定义构造函数,或 allocate(matrix(2, 2) :: a) 的参数化类型。但是对于a(1, :) = [1, 2]是没有办法的,只能把a当作一个数组(或者字符)来解释。 fortran 中没有索引重载

标签: fortran derived-types


【解决方案1】:

不幸的是,语法 a(1,:) = [1,2] 其中a 是派生类型,目前 Fortran 标准(撰写本文时为 Fortran 2018)不允许。

a proposal 在未来的 Fortran 标准中允许这样做。

【讨论】:

    【解决方案2】:

    您可以使用associate 语句将某些表达式绑定到较短的名称。这可用于为变量的组件命名。

        allocate(A%mat(2, 2))
        associate(B => A%mat(:, :))
            B(1,:) = [1, 2]
            B(2,:) = [3, 4]
            write(*, *) B
        end associate
    

    请注意,您还可以使用reshape 和自动分配来摆脱一些切片。

    ! No allocate statement necessary.
    A%mat = reshape([1, 2, 3, 4], [2, 2])
    

    【讨论】:

    • 好点,但B 只能在associate 块中使用,而不是在整个程序主体中使用。此外,我更喜欢一种不需要为A 引入另一个辅助变量的解决方法。
    • > 此外,我更喜欢一种不需要为 A 引入另一个辅助变量的解决方法。你可以只做 associate(A => A%mat) (覆盖原始派生类型的 A
    猜你喜欢
    • 2012-10-23
    • 2019-03-02
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    相关资源
    最近更新 更多