Pointers 为什么不能在Fortran-90中连续分配指针链?
我正在尝试在Win32/x86平台上使用Fortran 90中的指针学习链表的数据结构 但是,当我运行的测试用例仅仅是为了构建一个包含100个项目的列表时,程序终止时会出现“访问冲突”错误 在错误发生之前,列表还远远没有完成 在调试运行中,结果表明,在某个时刻,下一个指针的分配失败 我想知道为什么会这样 如何使用指针成功构建链表 代码如下:Pointers 为什么不能在Fortran-90中连续分配指针链?,pointers,linked-list,fortran,allocation,Pointers,Linked List,Fortran,Allocation,我正在尝试在Win32/x86平台上使用Fortran 90中的指针学习链表的数据结构 但是,当我运行的测试用例仅仅是为了构建一个包含100个项目的列表时,程序终止时会出现“访问冲突”错误 在错误发生之前,列表还远远没有完成 在调试运行中,结果表明,在某个时刻,下一个指针的分配失败 我想知道为什么会这样 如何使用指针成功构建链表 代码如下: TYPE Ptr INTEGER :: I TYPE(Ptr),POINTER :: PREV,NEXT END T
TYPE Ptr
INTEGER :: I
TYPE(Ptr),POINTER :: PREV,NEXT
END TYPE Ptr
TYPE(Ptr),POINTER :: P
INTEGER :: IP,Err
ALLOCATE(P)
DO IP=1,100
P%I = IP
IF ( .NOT.ASSOCIATED(P%NEXT) ) THEN
ALLOCATE(P%NEXT, STAT=Err )
END IF
P%NEXT%PREV => P
P => P%NEXT
END DO
在使用gfortran 7.2的UBUNTU上,您的程序编译后运行良好。但是,您的程序有两个问题可能会使编译器崩溃: 分配
p
后,指针p%next
和p%prev
的状态未定义。可能是编译器在语句IF(.not.associated(p%next))
时出错,因为p%next
的状态未定义。在使用指针或以任何方式引用指针之前,请始终将其置零。尝试:
program pointers
!
TYPE Ptr
INTEGER :: I
TYPE(Ptr),POINTER :: PREV,NEXT
END TYPE Ptr
!
TYPE(Ptr),POINTER :: P => NULL() ! Make sure all pointer are nullified
TYPE(Ptr),POINTER :: head => NULL()
TYPE(Ptr),POINTER :: temp => NULL()
INTEGER :: IP,Err
!
NULLIFY(P) ! This is identical to the nullify in the declaration statement
NULLIFY(head) ! I've added it to show both styles
NULLIFY(temp)
!
ALLOCATE(P)
NULLIFY(P%NEXT) ! Always nullify pointers
NULLIFY(P%PREV) ! Always nullify pointers
head => P ! To keep a header to your list is a good idea
!
DO IP=1,100
write(*,*) ip
P%I = IP*IP ! Trivial unimportant change
!
IF ( .NOT.ASSOCIATED(P%NEXT) ) THEN
ALLOCATE(P%NEXT, STAT=Err )
P%NEXT%I = ip+1 ! define entries
NULLIFY(P%NEXT%NEXT) ! for next node
NULLIFY(P%NEXT%PREV) ! for all elements of your TYPE
END IF
!
P%NEXT%PREV => P
P => P%NEXT
!
END DO
!
temp => head ! temporary pointer to navigate
DO WHILE( ASSOCIATED(temp) )
write(*,*) ' AT NODE ', temp%i
temp => temp%next
ENDDO
!
end program pointers
正如@Alexander Vogt所指出的,你失去了列表的开头。我添加了一个名为head的指针来保留列表的开头。如果您查看输出,您会注意到程序实际上生成了一个100+1条目的列表,因为您先生成
p
,然后再添加100次p%,接下来
您能给出确切的状态代码Err
?或者,省略STAT=Err
并将错误打印到终端。P=>P%NEXT
。。。你松开了指向列表开头的指针!在调试运行中,Err为0(这也是混淆的);刚才我很困惑,当我评论“IF..THEN”和“END IF”时,代码工作正常,没有错误发生……???始终将指针派生的tyoe组件定义为,pointer::next=>null()
非常感谢大家!将新分配的指针置为空可解决此问题!我非常感激!它帮助我学到很多东西