Compilation Fortran 90中的分段错误(内核转储)

Compilation Fortran 90中的分段错误(内核转储),compilation,segmentation-fault,fortran,Compilation,Segmentation Fault,Fortran,我正在写一个Fortran 90代码(如下),我得到一个segfault(内核转储)错误。什么是堆芯转储,如何修复 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(:,:), A

我正在写一个Fortran 90代码(如下),我得到一个segfault(内核转储)错误。什么是堆芯转储,如何修复

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

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

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

  • 您在
    ay(
    )中缺少了一个
    *
    。实际上,我很惊讶这段代码是为您编译的
  • 为什么对
    pi
    使用如此低的精度值?您要求精度为15位小数,但
    pi
    的值仅为6
  • step、nstp和initialized的目的是什么?我想它们是为了实现功能?您应该努力提供一个
  • 在这里添加save属性没有任何作用。您应该了解它的实际作用,但它通常是不需要的。在程序中,它肯定不起任何作用

要回答第二个问题,segfaults的出现有很多原因。Core dumped仅指系统对分段错误的处理。分段错误的原因有很多;尝试访问未分配的数组是其中之一。

我要补充的是,一些编译器标志在调试此类问题时非常有用。F或者gfortran,我将以
-g-Wall-fcheck=all