Compilation Fortran 90中的分段错误(内核转储)
我正在写一个Fortran 90代码(如下),我得到一个segfault(内核转储)错误。什么是堆芯转储,如何修复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
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(
。实际上,我很惊讶这段代码是为您编译的*
- 为什么对
使用如此低的精度值?您要求精度为15位小数,但pi
的值仅为6pi
- step、nstp和initialized的目的是什么?我想它们是为了实现功能?您应该努力提供一个
- 在这里添加save属性没有任何作用。您应该了解它的实际作用,但它通常是不需要的。在程序中,它肯定不起任何作用
要回答第二个问题,segfaults的出现有很多原因。Core dumped仅指系统对分段错误的处理。分段错误的原因有很多;尝试访问未分配的数组是其中之一。我要补充的是,一些编译器标志在调试此类问题时非常有用。F或者gfortran,我将以
-g-Wall-fcheck=all