【问题标题】:Program received signal SIGBUS: Access to an undefined portion of a memory object程序收到信号 SIGBUS:访问内存对象的未定义部分
【发布时间】:2016-12-22 01:25:14
【问题描述】:

我有这个简单的 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 编译我的代码。

【问题讨论】:

  • real*8 不是有效的 Fortran 并且从来不是任何 ISO Fortran 标准的一部分。

标签: fortran runtime-error gfortran bus-error


【解决方案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

【讨论】:

  • @Vladimir F,我很抱歉我是个外行,但是我该如何解决这个问题呢?
  • @user3578925 你可以将你想要的东西作为变量传递,或者使用value 属性作为虚拟参数,或者创建一个本地副本。我很确定我们最近看到了一个非常相似/有用的问题,但我无法立即找到它。
  • 但是对于value,你需要那个显式接口。
  • 好的,如果我使用 y = 10 然后执行 "x = rrr(y)" 就可以了。老实说,我不明白这一点。我可以用明确的数字调用子例程,即我可以“调用任何东西(10,输出)”,只要数字 10 在子例程中定义为整数,它就可以工作。
  • 问题是你在函数内部修改!您不能修改常量文字 10。您必须简单地接受这一点,这是 Fortran 规则。
猜你喜欢
  • 2020-06-16
  • 1970-01-01
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 1970-01-01
  • 2019-08-07
相关资源
最近更新 更多