程序接收信号SIGBUS:访问存储器对象的未定义部分

时间:2016-08-15 19:39:43

标签: fortran runtime-error gfortran bus-error

我有这个简单的Fortran代码和一个我在主程序中明确提供参数的函数。代码如下:

   implicit none

   real*8 rrr,x
   external tttt

   x = rrr(10)

   end

   function rrr(seed)
   integer seed, k
   real*8 rrr
   k = 7
   seed = 16807 * ( seed - k * 127773 ) - (k * 2836)
   print*,seed
   rrr = seed / 2.
   end

它编译,但在运行时会产生以下错误:

Program received signal SIGBUS: Access to an undefined portion of a memory object.

Backtrace for this error:
#0  0x10f43bfe6
#1  0x10f43b7ac
#2  0x7fff89740529
#3  0x10f433d78
#4  0x10f433e2c
#5  0x10f433e6e
Bus error: 10

任何可能导致错误的想法?我使用gfortran编译我的代码。

1 个答案:

答案 0 :(得分:1)

您正在修改函数中的种子。你不能那样做,因为它是常数10。如果您传递的内容不是可定义的,则无法修改函数中的seed。一个常数字面是不可定义的。变量通常是。

另外,请勿使用外部功能。使用模块,或将您的函数放入包含部分,使其成为内部。这样调用者将具有显式接口并且可以检查代码的正确性。

特别是如果您创建函数参数intent(in)并检查接口,则可以自动避免您所犯的错误。即使没有模块,如果启用所有警告和错误检查,许多编译器也会发现问题。例如gfortran中的-g -fcheck=all -Wall -fbacktrace

为您修复:

   real*8 :: x
   integer :: iseed

   iseed = 10
   x = rrr(iseed)

   contains

     function rrr(seed)
       real*8 :: rrr
       integer, intent(in) :: seed
       integer :: kk

       k = 7
       seed = 16807 * ( seed - k * 127773 ) - (k * 2836)

       print *,seed
       rrr = seed / 2.
     end function

   end program