Fortran 90中的分段错误(Core Dumped)

时间:2017-03-22 01:44:47

标签: compilation segmentation-fault fortran

我正在编写Fortran 90代码(下面),我收到了段错(核心转储)错误。什么是Core Dumped以及如何解决?

program make_pict
    IMPLICIT NONE
    INTEGER, PARAMETER :: REAL8=SELECTED_REAL_KIND(15,300)
    INTEGER, SAVE :: nstp,npr,step
    REAL(REAL8), SAVE :: r 
    REAL(REAL8), DIMENSION(:,:), ALLOCATABLE, SAVE ::  f,fa
    INTEGER :: xw,yw,x,y
    REAL:: ax,ay
    INTEGER, DIMENSION(250000) ::  pxa
    REAL(REAL8) :: s,s2 
    LOGICAL, SAVE :: initialized=.FALSE.

    WRITE(*,*) 'give values ax,ay'
    READ(*,*) ax,ay
    xw = 256
    yw = 256

    OPEN(1,FILE='picture.pxa')

    do x=0, xw-1
        do y=0, yw-1
            f(x,y)=(765./2)*(ax*(1-cos(2*3.14159*x*(1.0/xw)))+ay(1+cos(2*3.14159*y*(1.0/yw))))
        end do
    end do

    WRITE(1,'(2I6)') xw,yw
    ALLOCATE(f(0:xw-1,0:yw-1),fa(0:xw-1,0:yw-1))
    DO y=0,yw-1
    WRITE(1,'(256I4)') (f(x,y),x=0,xw-1)
    END DO
    CLOSE(1)     
    initialized=.TRUE.

    step=0
    nstp=100
end program make_pict

1 个答案:

答案 0 :(得分:1)

您尝试在分配之前设置f。你需要在双循环之前设置allocate语句!自己解决这个问题的一种方法是将输出语句放在任何地方,这将精确定位错误的位置。

我注意到的其他一些问题:

  • 您错过了*中的ay(。实际上,我很惊讶为你编写的这段代码。
  • 为什么要为pi使用这种低精度值?您是否要求精确到第15个小数,但pi的值仅为6?
  • step,nstp和initialized的目的是什么?我想他们是要实现的功能?您应该努力提供minimal, complete, and verifiable example
  • 添加保存属性不会在此处执行任何操作。你应该阅读它实际上做了什么,但通常不需要它。在一个程序中,它绝对没有任何作用。

要回答您的第二个问题,可能会出现多个段错误。核心转储仅指系统对分段故障的处理。分段错误的原因很多;尝试访问未分配的数组就是其中之一。