关于 SO 上的堆栈的问题,终于!我的一生都让我走到了这一步。
所以我需要将我制作的一些相当大的自定义数据结构合并到一个堆栈中。我决定编写一个仅包含一个整数值的最小堆栈结构。这里是 -
MODULE STACK_MODULE
IMPLICIT NONE
TYPE ELEMENT_TYPE
INTEGER(4) :: VAL
TYPE(ELEMENT_TYPE), POINTER :: PREV
END TYPE ELEMENT_TYPE
TYPE STACK_TYPE
INTEGER(4) :: SIZE=0
TYPE(ELEMENT_TYPE), POINTER :: LASTIN
END TYPE STACK_TYPE
CONTAINS
SUBROUTINE PUSH(VAL_,STACK)
IMPLICIT NONE
INTEGER(4), INTENT(IN) :: VAL_
TYPE(STACK_TYPE), INTENT(INOUT) :: STACK
TYPE(ELEMENT_TYPE),TARGET :: CURRENT
! INIT CURRENT
CURRENT%VAL = VAL_
CURRENT%PREV => STACK%LASTIN
! ADD CURRENT TO STACK
STACK%LASTIN => CURRENT
STACK%SIZE = STACK%SIZE+1
RETURN
END SUBROUTINE PUSH
SUBROUTINE POP(STACK,VAL_)
IMPLICIT NONE
TYPE(STACK_TYPE), INTENT(INOUT) :: STACK
INTEGER(4) , INTENT(OUT) :: VAL_
TYPE(ELEMENT_TYPE), POINTER :: B4LASTIN
!WRITE TO VAL_
IF (ASSOCIATED(STACK%LASTIN)) THEN
VAL_ = STACK%LASTIN%VAL
!TAKE OUT THE LAST-IN ELEMENT
B4LASTIN => STACK%LASTIN%PREV
STACK%LASTIN => B4LASTIN
STACK%SIZE = STACK%SIZE-1
ELSE
IF (STACK%SIZE.NE.0) THEN
PRINT*, STACK%SIZE
STOP 'MISMATCH BETWEEN STACKSIZE AND POINTER: BAD BOOK KEEPING!'
END IF
END IF
RETURN
END SUBROUTINE POP
END MODULE STACK_MODULE
PROGRAM MAIN
USE STACK_MODULE
IMPLICIT NONE
INTEGER(4) :: I,J
TYPE(STACK_TYPE) :: STACK1
DO I = 1,10
CALL PUSH(I,STACK1)
END DO
DO WHILE (ASSOCIATED(STACK1%LASTIN))
CALL POP(STACK1,J)
PRINT*, J
END DO
END PROGRAM
结果让我大吃一惊!我怀疑
SIZE
柜台会跟上.. 但不是这个。 10
-1076898780
1752444
-1219604480
1651076143
stderr
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
Backtrace for this error:
#0 0xB777FD63
#1 0xB77803F0
#2 0xB78713FF
#3 0x8048666 in __stack_module_MOD_pop
#4 0x80487A3 in MAIN__ at prog.f95:?
关于我哪里出错的任何指示(停顿,同时无法控制地咯咯笑)?
Here is the link to the code on IDEONE.
编辑:The IDEONE link现在包含代码的更新版本,其中包含解决方案!希望它可以作为堆栈的通用模板重用!
最佳答案
几个小问题
1) PUSH 退出时,CURRENT 随之消失。你需要类似的东西
TYPE(ELEMENT_TYPE),POINTER :: CURRENT
! INIT CURRENT
ALLOCATE(CURRENT)
2)同样的,当POP完成时,它需要删除数据所以
B4LASTIN => STACK%LASTIN%PREV
DEALLOCATE(STACK%LASTIN)
STACK%LASTIN => B4LASTIN
3) ASSOCIATED 有效,但前提是指针正确初始化。
TYPE(STACK_TYPE) :: STACK1
STACK1%LASTIN => NULL()
你应该准备好运行了。
关于stack - Fortran : trying to make a minimal stack datastructure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20273207/