分段故障 - fortran 90 - 二分子程序

时间:2013-02-11 14:11:40

标签: segmentation-fault fortran90 bisection

program bisect
real(8) ::  output
call bisection(3.d0,4.d0,2.d0,output)
print*, output
end program bisect

subroutine bisection(a,b,error,result)
real(8):: a,b,error,c,result
logical:: proceed
  proceed = .true.
  do while (proceed)
  if (sin(a)*sin(b).lt. 0.d0) then
     c=(a+b)/2
     if (sin(a)*sin(c).lt.0.d0) then
        b=c
     else
        a=c
     end if
  else  
     stop 'cannot be bisected'
  end if 

  if (abs(a-b).lt. error) then
     proceed = .false.
  end if
 end do
 result= a
end subroutine bisection

上传相同代码的版本here

这是我能想到的最小例子。这会在使用gfortran运行可执行文件时产生分段错误,也会在网站上产生分段错误。

1 个答案:

答案 0 :(得分:2)

伪参数a和b与作为常量的实际参数相关联。常量不可定义 - 您的程序正在尝试更改“3.0d0”或“4.0d0”的值。如果你的计划取得成功,那么混乱就会在整个宇宙中爆发。

我强烈建议:

  • 使用模块程序。这允许编译器检查实际参数是否与伪参数一致。
  • 对伪参数定义使用INTENT规范。这允许编译器检查需要修改的内容,以及可能未修改的内容不是。

问题的解决方法是在主程序中包含适当的变量,其中包含初始值3.0d0和4.0d0,并将这些可修改的变量传递给子例程。或者,您可以在子例程中创建伪参数的临时副本。在F2003中,VALUE属性可用于自动执行此操作。

虽然我们在这里 - 在所有范围内使用IMPLICIT NONE。总是