Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran派生类型的指针成员为isn';抄袭_Fortran - Fatal编程技术网

Fortran派生类型的指针成员为isn';抄袭

Fortran派生类型的指针成员为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:

当我在函数或子例程内部初始化一个对象并试图返回它时,构造函数中设置的指针成员似乎变得未定义(尽管我可能误解了正在发生的事情)

我想确切地了解这里发生了什么,如果可能的话,如何在构造函数中初始化指针,然后从函数或子例程返回对象,同时保留指针

MWE:

使用gfortran 5.4.0

$ 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