gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:52:09 24 4
gpt4 key购买 nike

一般来说,我想重命名通过子例程参数传递的派生类型中的可分配变量。用 '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

这就是失败的原因:

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

这似乎是一个小问题,但我想在将来阅读我的代码时不会感到太痛苦。那么最好的选择是什么?非常感谢。

最佳答案

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

您还可以将派生类型的子对象用作执行操作的过程的实际参数。

你的指针方法失败了,因为你有一个等级不匹配 - 你试图将标量指针与数组目标相关联。如果您的过程的显式接口(interface)在调用范围内不可用,您也可能遇到问题。带有 TARGET 属性的虚拟参数的过程需要显式接口(interface)。

对这种简单的名称别名使用指针可能会降低编译器优化代码的能力。应该首选 ASSOCIATE 之类的东西。

关于pointers - 指向包含可分配数组的派生类型的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38887583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com