forrtl:严重(174):SIGSEGV,发生分段错误

时间:2015-08-18 02:37:10

标签: linux fortran

我真的需要你的帮助!我想知道是不是因为数组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 

1 个答案:

答案 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

根据gfortranifort的文档,Fortran 2003标准中有一个名为IS_IOSTAT_END的函数。不幸的是,我无法找到其规范的位置。但是,根据the gfortran documentation"该函数等效于将变量与内在模块IOSTAT_END"的ISO_FORTRAN_ENV参数进行比较,这是标准化的。 / p>