2013-10-19 64 views
1

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

距离(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 

回答

3

函数修改它的所有虚拟参数,条形码l。将变量以外的任何变量与修改的虚拟参数相关联是错误的。 13.0d0不是一个变量,z6是。

2

扩展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)