【发布时间】:2016-01-18 11:51:00
【问题描述】:
我有一个类型 var,它包含一个指针 p。 我需要将 var 复制到与 var 相同类型的另一个变量 var1 上(通过做 var1 "=" var,在引号中,因为我不知道这是否正确,见下文)。
在我的实现中 var 和 var1 被传递给一个需要将 var1 初始化为 var 然后修改 var1 的子例程。 如果我改变了 var1%p 的值,那么 var%p 也会被修改。 所以,我需要改变var1%p指向的内存区域的值,而不修改var%p指向的内存区域。 在 Fortran (2003, Intel) 中这样做的正确方法是什么?
代码示例:
type variable
real, dimension(:), pointer:: p
end type variable
subroutine init(var,var1) !This of course will not work
type (variable):: var, var1
var1=var
end subroutine
现在,我需要能够在不影响 var%p 的情况下执行与更改 var1%p 等价的操作。我无法更改变量(我正在修改现有代码)。
以下解决方案(如果我是正确的): 我将 var1 声明为:
Type(variable), allocatable:: Var1
然后分配和初始化:
allocate(var1, source=var)
var1 = var
然后
call somesub(var1)
修改 var1%p 的结果是修改 var%p 使得 var%p 等于 var1%p。
编辑 3: 正在做:
subroutine init(var,var1)
type(variable), intent(in):: var
type(variable), allocatable, intent(inout):: var1
allocate(var1%p, source=var%p)
var1%p = 2
end subroutine init
type variable:: var
type variable, allocatable:: var1
call init(var, var1)
以上编译但崩溃(无限挂起)。 改为使用:
allocate(var1, source=var)
运行但将 var%p 更新为 1。
【问题讨论】:
-
您是否有一些最少的代码可以展示给我们,以确保我们完全理解您的问题?
-
我冒昧地猜测一下:您可能最好使用可分配数组来完成您正在尝试做的事情,而不是指针及其目标。如果两个指针指向同一个“内存区域”,那么更改(一个)内存区域的内容当然会影响两个指针指向的内容。您希望指针指向不同的内存区域,尽管可能在关联第二个指针的同时包含相同的内容。但是没有代码真的无法回答你的问题。
-
@HighPerformanceMark 问题已更新