Segmentation fault fortran 90函数的双精度参数

Segmentation fault fortran 90函数的双精度参数,segmentation-fault,fortran,fortran90,double-precision,Segmentation Fault,Fortran,Fortran90,Double Precision,我试着用gfortran编译下面的fortran90代码,这个程序只输出一个双精度函数distance()的值,这个函数有7个参数。当我试着运行它的时候 我得到消息“分段错误(核心转储)”,但如果我重写 距离(z1,z2,z3,z4,z5,13.0d0,z7) 到 距离(z1,z2,z3,z4,z5,z6,z7),其中z6的值为13.0d0,并重新编译我得到的值 正确的值为13.000 有人知道为什么吗?他们看起来和我一模一样。谢谢 program distancetest implicit n

我试着用gfortran编译下面的fortran90代码,这个程序只输出一个双精度函数distance()的值,这个函数有7个参数。当我试着运行它的时候 我得到消息“分段错误(核心转储)”,但如果我重写

距离(z1,z2,z3,z4,z5,13.0d0,z7) 到 距离(z1,z2,z3,z4,z5,z6,z7),其中z6的值为13.0d0,并重新编译我得到的值 正确的值为13.000

有人知道为什么吗?他们看起来和我一模一样。谢谢

program distancetest
implicit none
double precision::drand,distance
double precision::z1,z2,z3,z4,z5,z6,z7
!*********************************
z1=1.0d0
z2=1.0d0
z3=1.0d0
z4=4.0d0
z5=5.0d0
z6=13.0d0
z7=100.0d0
write(*,*) distance(z1,z2,z3,z4,z5,13.0d0,z7)
end program distancetest
!*********************************
double precision function distance(x1,y1,z1,x2,y2,z2,l)
implicit none
double precision::x1,x2,y1,y2,z1,z2,l,x,y,z
x1=x1-l*dble(floor(x1/l))
y1=y1-l*dble(floor(y1/l))
z1=z1-l*dble(floor(z1/l))
x2=x2-l*dble(floor(x2/l))
y2=y2-l*dble(floor(y2/l))
z2=z2-l*dble(floor(z2/l))
x=min(abs(x1-x2),l-abs(x1-x2))
y=min(abs(y1-y2),l-abs(y1-y2))
z=min(abs(z1-z2),l-abs(z1-z2))
distance=sqrt(x*x+y*y+z*z)
end function distance

该函数修改其所有伪参数bar
l
。将变量以外的任何内容与修改的伪参数相关联是错误的
13.0d0
不是一个变量,
z6
是。

扩展IanH的答案,如果您将过程放入模块并使用这些模块,以便编译器可以检查参数的一致性,并且如果您指定参数意图,那么大多数Fortran编译器都会为您发现这个问题

module MyFunc
   implicit none
contains
   double precision function distance(x1,y1,z1,x2,y2,z2,l)
   implicit none
   double precision, intent (inout)::x1,x2,y1,y2,z1,z2
   double precision, intent (in) :: l
   double precision :: x,y,z
   x1=x1-l*dble(floor(x1/l))
   y1=y1-l*dble(floor(y1/l))
   z1=z1-l*dble(floor(z1/l))
   x2=x2-l*dble(floor(x2/l))
   y2=y2-l*dble(floor(y2/l))
   z2=z2-l*dble(floor(z2/l))
   x=min(abs(x1-x2),l-abs(x1-x2))
   y=min(abs(y1-y2),l-abs(y1-y2))
   z=min(abs(z1-z2),l-abs(z1-z2))
   distance=sqrt(x*x+y*y+z*z)
   end function distance
end module MyFunc


program distancetest
use MyFunc
implicit none
double precision::z1,z2,z3,z4,z5,z6,z7
!*********************************
z1=1.0d0
z2=1.0d0
z3=1.0d0
z4=4.0d0
z5=5.0d0
z6=13.0d0
z7=100.0d0
write(*,*) distance(z1,z2,z3,z4,z5,13.0d0,z7)
end program distancetest
例如,从gfortran:

write(*,*) distance(z1,z2,z3,z4,z5,13.0d0,z7)
                                   1
Error: Non-variable expression in variable definition context (actual argument to INTENT = OUT/INOUT) at (1)