stack - Fortran : trying to make a minimal stack datastructure

标签 stack fortran fortran90 fortran95 fortran2003

关于 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/

相关文章:

fortran - Fortran 90中的堆栈溢出

java - 使用接口(interface)创建 Stack Generic ArrayList

function - 有没有办法在 fortran 中隐式定义函数中间程序'

python - f2py - 函数参数的顺序困惑

具有可选组件的 Fortran 派生类型

fortran - MPI_SCATTER Fortran 矩阵(按行)

java - 什么时候 ThreadLocal 优于局部变量?

java - 使用队列伪代码实现堆栈

Java Stack Push write 方法 - 目前得到奇怪的输出

fortran - 什么时候需要数组解除分配?