我真的需要你的帮助!我想知道是不是因为数组coor。
我使用ifort msd.f90 -o msd.x编译了一个fortran程序
在我运行./msd.x后,它给了我分段错误
我的Fortrain代码是:
program mean_square_displacement
implicit none
integer i,j,k,natom,mstep
integer, parameter :: mmax=5000,nmax=1000,kmax=3
real*16 vector(3,3),d(3)
real*16,dimension(kmax,nmax,mmax) :: coor
real*16 msdtotal(mmax),msd(nmax,mmax)
open(unit=8,file="vector")
read(unit=8,fmt=*) (vector(k,1),k=1,3)
read(unit=8,fmt=*) (vector(k,2),k=1,3)
read(unit=8,fmt=*) (vector(k,3),k=1,3)
do j=0,mmax
do i=0,nmax
do k=0,kmax
coor(k,i,j)=0.d0
enddo
enddo
enddo
open(unit=9,file="trace")
i=0
j=0
10 continue
read(unit=9,fmt=*,end=100) (d(k),k=1,3)
i=i+1
coor(1,i,j)=d(1)
coor(2,i,j)=d(2)
coor(3,i,j)=d(3)
write(6,20), coor(1,i,j),coor(2,i,j),coor(3,i,j)
goto 10
100 continue
natom=130
mstep=j
20 format(3(1x,f12.9))
stop
end
答案 0 :(得分:4)
分段错误通常是通过从分配的边界访问数组引起的。
在您的情况下,数组coor
被分配为coor(1:kmax,1:nmax,1:nmax)
,1
是默认的下限。但是,您定期访问一个或多个索引为0
的数组。
如果要更改下限,可以使用dimension(0:kmax,0:nmax,0:nmax)
分配数组。
顺便说一下:你的阅读循环没有增加j
,你应该避免使用goto
,因为它样式不好而难以阅读。
可以使用IOSTAT=
说明符检测文件的结尾。你的阅读循环看起来像:
i=0
j=0
do
read(unit=9,fmt=*,iostat=ios) (d(k),k=1,3)
if (iostat /= 0) exit ! exit the read loop if reading breaks (e.g. EOF)
i=i+1
j=j+1 -- this might be missing from your original source?!
coor(1,i,j)=d(1)
coor(2,i,j)=d(2)
coor(3,i,j)=d(3)
write(6,20), coor(1,i,j),coor(2,i,j),coor(3,i,j)
end do
根据gfortran和ifort的文档,Fortran 2003标准中有一个名为IS_IOSTAT_END
的函数。不幸的是,我无法找到其规范的位置。但是,根据the gfortran documentation"该函数等效于将变量与内在模块IOSTAT_END
"的ISO_FORTRAN_ENV
参数进行比较,这是标准化的。 / p>