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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.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
Pointers 为什么在Fortran中调用对不相关整数变量的write会取消分配一个无限制的多态指针?_Pointers_Fortran_Polymorphism_Gfortran - Fatal编程技术网

Pointers 为什么在Fortran中调用对不相关整数变量的write会取消分配一个无限制的多态指针?

Pointers 为什么在Fortran中调用对不相关整数变量的write会取消分配一个无限制的多态指针?,pointers,fortran,polymorphism,gfortran,Pointers,Fortran,Polymorphism,Gfortran,我试图将任何类型的值保存在一个无限制的多态类指针中,然后使用将返回值作为特定类型的函数检索该值。到目前为止,我只为整数编写了代码 文件名:pointers.f90 模块指针\u示例 包含 子程序赋值_int(pt,val) 类(*),可分配,目标::临时 类(*),指针,意图(inout)::pt 整数,意图(in)::val 分配(临时,源=val) pt=>温度 结束子例程赋值_int 纯函数int_val(pt)结果(val) 类别(*),目的(in)::pt 整数::val 选择类型(v

我试图将任何类型的值保存在一个无限制的多态类指针中,然后使用将返回值作为特定类型的函数检索该值。到目前为止,我只为整数编写了代码

文件名:pointers.f90

模块指针\u示例
包含
子程序赋值_int(pt,val)
类(*),可分配,目标::临时
类(*),指针,意图(inout)::pt
整数,意图(in)::val
分配(临时,源=val)
pt=>温度
结束子例程赋值_int
纯函数int_val(pt)结果(val)
类别(*),目的(in)::pt
整数::val
选择类型(v=>pt)
类型为(整数)
val=v
结束选择
返回
结束函数值
结束模块指针\u示例
主程序
例如,使用指针
隐式无
类(*),指针::pt
整数::i=10
整数::输出单位=6
呼叫分配(第10部分)
写入(输出单位),(“1.int_val(pt)=”,I2)“int_val(pt)
写入(输出单位,“(“i==int\u val(pt)”,L1)”int\u val(pt)==i
写入(输出单位“(“i=”,I2)”i
写入(输出单位),(“2.int_val(pt)=”,I2)“int_val(pt)
写入(输出单位,“(“i==int\u val(pt)”,L1)”int\u val(pt)==i
呼叫分配(第10部分)
写入(输出单位),(“3.int_val(pt)=”,I2)int_val(pt)
主程序结束
当我用gfortran编译它并运行我得到的代码时:

$ gfortran -o pointers pointers.f90 ; ./pointers
1. int_val(pt) = 10
i == int_val(pt)? T
i = 10
2. int_val(pt) = **
i == int_val(pt)? F
3. int_val(pt) =  0


在第二种情况下,我不希望int_val(pt)=**。比较int_val(i)==i似乎表明,在调用write(output_unit'(“i=”,I2)”i之前,它们都是具有相同值的整数,但之后它们就不一样了。除了打印到控制台之外,似乎还有一个额外的副作用,我不知道。有人能解释这种行为吗?

多亏了@evets的回应,我找到了解决办法。我已将旧代码注释掉:

subroutine assign_int(pt,val)
    !class(*),allocatable,target :: temp
    class(*),pointer,intent(inout) :: pt
    integer,target,intent(in) :: val

    ! allocate(pt,source=val)
    ! pt => temp
    pt => val
end subroutine assign_int

实际上,临时(temp)指针被解除分配是因为它未保存,并且未由assign\u int函数返回。根据Fortran标准“19.5.2.5:当……(3)指针的目标被释放而不是通过指针时,指针的关联状态变为未定义”,pt目标未定义

使用“英特尔Fortran 19.0.5”构建的程序运行正常。这可能只是gfortran版本中的一个bug—写入操作不应更改其他值。有时这种行为是由编码错误引起的,但我还没有在这里发现。感谢您使用ifort检查这一点。我非常犹豫是否要说编译器中存在错误,但这里可能就是这种情况。(编辑:仅供参考,我正在使用最新的GNU Fortran 9.2.0)变量
temp
assign\u ptr
中的本地可分配变量。Fortran标准规定:当通过执行RETURN或END语句终止过程的执行时,如果过程的未保存可分配局部变量是函数结果或其子对象,则它将保留其分配和定义状态;否则,如果已分配,则将取消分配`临时取消分配。然后您需要查看19.5.2.5:当。。。(3) 指针的目标不是通过指针释放的,