我已经很好地浏览了前几篇文章,我不认为这个话题已经涉及到了,希望有人能帮上忙。我正在用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和氢%核心%x在内存中是相同的地址(cur_x(2))。,所以我有两个问题,
我可以解决这个问题,但这将牺牲我将需要的更复杂的计算的一般性。我也很想了解这里到底出了什么问题。
谢谢你的帮忙!吉姆
编辑:为各种事情添加了'target‘属性;请注意,这总是在代码中,我只是在传递到这个帖子时忘记了它们。
编辑:为了澄清,我对上面的代码的主要问题是,最后的写命令给出了氢原子%核心%x的未初始化输出,即使在第一次写入之后仍然遵循关联命令。即使我在类型定义中将core初始化为null,但它似乎存在问题;如果我试图在代码顶部取消它,程序就会崩溃。
发布于 2013-03-12 22:51:44
基本的问题是hydrogen%core没有关联。因此,associated(hydrogen%core%x)的作用是不确定的。您只是不能访问/查询派生类型指针(x)的字段(hydrogen%core),如果指针不相关联,例如指向内存中的null()而不是现有的派生类型实例。您的编译器可能会生成一段代码,当您尝试它时不会立即崩溃,但是在此之后所做的任何操作都是不确定的,因为您可能已经覆盖了一些随机内存地址的数据。
实际上,我用不同的编译器编译了一个自包含的代码版本(见下面),在第一个写语句中我得到了直接的分段错误。使用适当的检查选项,其中一个二进制文件甚至会报告引用不相关指针hydrogen%core的原因。如果您注释掉有问题的associated()查询(如下面的代码所示),所有二进制文件都运行良好。
另外,请注意,变量electron和proton必须具有目标属性,否则代码根本不应该编译。如果您的编译器编译代码时没有抱怨,那么您可能应该考虑更改为另一个代码。
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 testhttps://stackoverflow.com/questions/15373151
复制相似问题