Fortran派生类型的指针成员为isn';抄袭
当我在函数或子例程内部初始化一个对象并试图返回它时,构造函数中设置的指针成员似乎变得未定义(尽管我可能误解了正在发生的事情) 我想确切地了解这里发生了什么,如果可能的话,如何在构造函数中初始化指针,然后从函数或子例程返回对象,同时保留指针 MWE: 使用gfortran 5.4.0Fortran派生类型的指针成员为isn';抄袭,fortran,Fortran,当我在函数或子例程内部初始化一个对象并试图返回它时,构造函数中设置的指针成员似乎变得未定义(尽管我可能误解了正在发生的事情) 我想确切地了解这里发生了什么,如果可能的话,如何在构造函数中初始化指针,然后从函数或子例程返回对象,同时保留指针 MWE: 使用gfortran 5.4.0 $ gfortran -o mwe.x mwe.f90 $ ./mwe.x get_new_b: 52 using function: 127919104 new_b:
$ gfortran -o mwe.x mwe.f90
$ ./mwe.x
get_new_b: 52
using function: 127919104
new_b: 55
using subroutine: 127919104
我期望的结果是:
get_new_b: 52
using function: 52
new_b: 55
using subroutine: 55
在
get_new_b
过程中,您正在执行以下操作:
type(a) elt
elt = a(n)
r = b(elt)
这意味着您正在函数内创建一个局部变量elt
,然后使用该变量调用constructor\u b
(通过b
接口)。在constructor\u b
中,发生的是:
type(b) r
r%elt => elt
也就是说,您创建一个新的类型(b)
变量,并在其elt
字段和传递到的变量elt
之间进行指针关联
问题是:作为参数传递的实际参数elt
是函数get\u new\u b
范围的local。当控件返回主程序时,指针的目标(您在函数中创建的elt
变量)停止存在,指针将“悬空”
您不应该有指向超出范围的变量的指针
在您提供的代码中,使用可分配组件更有意义。只有当您想将指针组件指向其他现有变量(其内存由代码的其他部分管理,而不是由类型本身管理)时,才应该有指针组件
但是,如果指针是您想要的,请确保其目标永远不会在带有指针组件的变量之前未定义。这很有意义,谢谢。我如何使用allocatable做同样的事情?我一直认为可分配仅限于数组,这里我只需要一个标量值。标量也可以具有可分配属性,在您的情况下,我认为只需将组件中的指针更改为可分配(并将指针关联=>更改为赋值=)即可。实际上,只有当组件的类型在内存中很大时,才有意义在那里配置一个可分配组件。我想要指针的真正原因是
elt
可以是class(a)
,我可以利用运行时多态性将a
的子类型传递给b
构造函数。因此,尽管a
在内存中不是很大,但它需要是可分配的或用于编译的指针。这是很好的理由。可分配的就可以了。您可以传递具有所需运行时类型的变量,并使用source或mold:allocate(r%elt,source=elt)分配组件。另一个选项是只在构造函数上传递参数,而不具有要复制的中间类型(a)。例如,您重构构造_b以接收整数n作为参数,然后执行:分配(a::r%elt),然后执行:r%elt%var=n。
type(b) r
r%elt => elt