指向包含可分配数组的派生类型的指针

Rui*_*zhi 3 fortran pointers derived-types allocatable-array

一般来说,我想重命名派生类型中的可分配变量,这些变量通过子例程参数传递.使用'derived%type_xx'编写所有内容并不是那么令人愉快.此外,我不想花费额外的内存来将派生类型的值复制到一个新的变量,这需要新的分配内存.此外,我知道可分配数组比指针更受欢迎,原因有很多.我尝试定义指向可分配变量的指针,但失败了.我试过这个,因为我想简化我的代码,既可读也不太长.我想知道是否有办法实现目标?谢谢.

这是演示代码:

Module module_type
IMPLICIT NONE
    TYPE type_1
        REAL,ALLOCATABLE                  ::      longname_1(:), longname_2(:)
    END TYPE
END MODULE

!------------------------------------------------------------------------------------------
SUBROUTINE TEST(input)
    USE MODULE module_type
IMPLICIT NONE
    TYPE(type_1)                          ::      input
    input%longname_1 = input%longname_1 + input%longname_2   ! Use one line to show what I mean
END SUBROUTINE
Run Code Online (Sandbox Code Playgroud)

这是失败的:

Module module_type
IMPLICIT NONE
    TYPE type_1
        REAL,ALLOCATABLE                  ::      longname_1(:), longname_2(:)
    END TYPE
END MODULE

!------------------------------------------------------------------------------------------
SUBROUTINE TEST(input)
    USE MODULE module_type
IMPLICIT NONE
    TYPE(type_1),TARGET                    ::      input

    REAL,POINTER                           ::      a => input%longname_1 &
                                                 & b => input%longname_2

    a = a + b   ! much better for reading
END SUBROUTINE
Run Code Online (Sandbox Code Playgroud)

这似乎是一个小问题,但我希望将来读取我的代码而不会有太多的痛苦.那么什么是最好的选择?非常感谢.

Ian*_*anH 5

您可以使用ASSOCIATE构造将简单名称与更复杂的指示符或表达式相关联.

您还可以使用派生类型的子对象作为执行该操作的过程的实际参数.

您的指针方法失败,因为您的排名不匹配 - 您试图将标量指针与数组目标关联起来.如果您的过程的显式接口在调用范围中不可用,您可能也遇到了问题.具有TARGET属性的伪参数的过程需要显式接口.

使用指针进行这种简单的名称别名可能会降低编译器优化代码的能力.应该首选像ASSOCIATE这样的东西.