我已经很好地浏览了以前的帖子,我认为这个话题已经被覆盖了,希望有人能提供帮助。我正在用 fortran 2003 编写代码,并使用 ifort。我有以下需要操作的类型,我设计了这些类型以提供所需的灵活性:
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 的指针
代码的初始化是这样的,我在其中添加了一些诊断行:
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
哪个打印
F F F T
1.0 1.0 1.0 <garbage>
我希望质子%x 和氢%core%x 是内存中的相同地址(cur_x(2))。所以我有两个问题
我已将所有指针初始化为空。为什么 associated(hydrogen%core%x) 给出真实的?如果我尝试在代码顶部取消这个指针,我会得到不一致的结果;使用
nullify(hydrogen%core%x)
导致分段错误。表演
hydrogen%core%x => null()
允许代码运行,但 associated(hydrogen%core%x) 保持为真
- 我已确保将指针列表从父级关联到子级,正如本 fortran 中令人惊讶的错误摘要中所建议的那样。proton%x 工作但hydro%core%x 产生垃圾的事实是我不明白的。
我可以解决这个问题,但这会牺牲我进行更复杂计算所需的一般性。我也很想了解这里出了什么问题。
谢谢你的帮助!吉姆
编辑:为各种事物添加了“目标”属性;请注意,这总是在代码中,我只是在转移到这篇文章时忘记了它们
编辑:澄清一下,我对上述代码的主要问题是最终的写入命令为hydro%core%x 提供了未初始化的输出,即使在第一次写入后遵循关联命令也是如此。尽管我在类型定义中将 core 初始化为 null,但它似乎存在问题;如果我尝试在代码顶部取消它,程序就会崩溃。