我正在编写一个Fortran 90代码(如下),我得到一个段错误(核心转储)错误。什么是核心转储,如何解决?
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
。在设置它的双循环之前,您需要分配语句!自己解决此问题的一种方法是将输出语句放在任何地方,这将查明错误的位置。
我注意到的其他一些问题:
- 你在
ay(
中错过了一个*
.实际上,我很惊讶为您编译的这段代码。 - 为什么要对
pi
使用如此低精度的值?您请求精确到小数点第 15 位,但您的pi
值仅变为 6? - 步骤、nstp 和初始化的目的是什么?我猜它们是为了实现功能吗?您应该努力提供一个最小、完整且可验证的示例。
- 添加 save 属性在此处不会执行任何操作。您应该阅读它的实际功能,但通常不需要它。在程序中,它绝对什么都不做。
为了回答您的第二个问题,发生段错误可能有多种原因。核心转储仅指系统对分段故障的处理。分段错误的原因有很多;尝试访问未分配的数组就是其中之一。