首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类()指向Fortran中指针的指针:奇怪的行为

类()指向Fortran中指针的指针:奇怪的行为
EN

Stack Overflow用户
提问于 2013-03-12 22:05:42
回答 1查看 198关注 0票数 0

我已经很好地浏览了前几篇文章,我不认为这个话题已经涉及到了,希望有人能帮上忙。我正在用fortran 2003编写一个代码,并使用ifort。我有以下需要操作的类型,我的设计是为了提供我所需要的灵活性:

代码语言:javascript
复制
module parameters    

double precision, target :: cur_x(3)    

    type fundamental
            double precision, pointer   ::  x => null()
    end type fundamental

    type, extends(fundamental) :: ion
            class(fundamental), pointer ::  core => null()
     end type ion

SAVE
end module parameters

我的想法是,通过使用列表中的前一个作为下一个的核心,建立一种连接的粒子列表。请注意,在现实中,我将有大量的扩展‘基本’,所有这些都可以是‘核心’的其他粒子。我希望计算出的数量x在物理内存中一起存在于一个数组中,因为我将以相当复杂的方式对它们的子集进行寻址,为此我希望使用另一组指向cur_x的指针。

代码的初始化过程如下,我添加了一些诊断行:

代码语言:javascript
复制
use parameters

    type(fundamental), target :: electron, proton
            type(ion), target :: hydrogen

    write(*,*)associated(electron%x),associated(proton%x), &
                   & associated(hydrogen%core),associated(hydrogen%core%x)

        electron%x => cur_x(1)

        hydrogen%core => proton
        proton%x => cur_x(2)
        hydrogen%x => cur_x(3)

        cur_x = 1.0

    write(*,*)electron%x,proton%x,hydrogen%x,hydrogen%core%x

哪种指纹

代码语言:javascript
复制
F F F T
1.0 1.0 1.0 <garbage>

我希望质子%x和氢%核心%x在内存中是相同的地址(cur_x(2))。,所以我有两个问题,

  1. 我已经初始化了所有的指针为null。为什么关联(氢%核心%x)是真实的?如果我试图在代码顶部取消这个指针,结果就会不一致; 零化(氢%核心%x) 导致分割错误。执行 氢%核心%x => null() 允许运行代码,但关联(氢%核心%x)仍然是正确的。
  2. 我已经按照对fortran中惊人错误的总结中的建议,确保将从父指针到子指针的列表关联起来。质子%x在工作,但是氢%核心%x会产生垃圾,这是我不明白的。

我可以解决这个问题,但这将牺牲我将需要的更复杂的计算的一般性。我也很想了解这里到底出了什么问题。

谢谢你的帮忙!吉姆

编辑:为各种事情添加了'target‘属性;请注意,这总是在代码中,我只是在传递到这个帖子时忘记了它们。

编辑:为了澄清,我对上面的代码的主要问题是,最后的写命令给出了氢原子%核心%x的未初始化输出,即使在第一次写入之后仍然遵循关联命令。即使我在类型定义中将core初始化为null,但它似乎存在问题;如果我试图在代码顶部取消它,程序就会崩溃。

EN

回答 1

Stack Overflow用户

发布于 2013-03-12 22:51:44

基本的问题是hydrogen%core没有关联。因此,associated(hydrogen%core%x)的作用是不确定的。您只是不能访问/查询派生类型指针(x)的字段(hydrogen%core),如果指针不相关联,例如指向内存中的null()而不是现有的派生类型实例。您的编译器可能会生成一段代码,当您尝试它时不会立即崩溃,但是在此之后所做的任何操作都是不确定的,因为您可能已经覆盖了一些随机内存地址的数据。

实际上,我用不同的编译器编译了一个自包含的代码版本(见下面),在第一个写语句中我得到了直接的分段错误。使用适当的检查选项,其中一个二进制文件甚至会报告引用不相关指针hydrogen%core的原因。如果您注释掉有问题的associated()查询(如下面的代码所示),所有二进制文件都运行良好。

另外,请注意,变量electronproton必须具有目标属性,否则代码根本不应该编译。如果您的编译器编译代码时没有抱怨,那么您可能应该考虑更改为另一个代码。

代码语言:javascript
复制
  module parameters    
  implicit none
  save

  type :: fundamental
    double precision, pointer ::  x => null()
  end type fundamental

  type, extends(fundamental) :: ion
    class(fundamental), pointer ::  core => null()
  end type ion

end module parameters

program test
  use parameters
  implicit none

  type(fundamental), target :: electron, proton
  type(ion) :: hydrogen
  double precision, target :: cur_x(3)

  ! If you remove the comment in the next statement, the program will be indeterministic
  ! and probably crash.
  write(*,*) associated(electron%x),associated(proton%x), &
      & associated(hydrogen%core)!, associated(hydrogen%core%x)

  electron%x => cur_x(1)
  hydrogen%core => proton
  proton%x => cur_x(2)
  hydrogen%x => cur_x(3)
  cur_x(:) = 1.0
  write(*,*)electron%x,proton%x,hydrogen%x,hydrogen%core%x

end program test
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15373151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档