2016-08-15 80 views
1

私はこの簡単なFortranコードと、メインプログラムの引数を明示的に指定する関数を持っています。コードは以下の通りです:プログラム受信信号SIGBUS:メモリオブジェクトの未定義部分へのアクセス

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 

任意のアイデアかもしれないエラーを引き起こして何:

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 

ただし、実行時に、それは次のエラーを生成し、コンパイル?私はgfortranを使って自分のコードをコンパイルします。

+0

'本物* 8'有効なFortranのではなく、任意のISO Fortranの標準の一部ではなかったです。 – jlokimlin

答えて

1

機能でシードを変更しています。あなたはそれが一定であるので、それをすることはできません。関数内でseedを変更することはできません。何かを渡すと、が定義されていません。が入ります。定数リテラルは定義できません。変数は通常です。

また、外部関数を使用しないでください。モジュールを使用するか、関数を内部にするcontainsセクションに入れます。こうすれば、呼び出し側は明示的なインタフェースを持ち、コードの正しさをチェックすることができます。

特に、関数の引数を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 
+0

@Vladimir F、そのような素人であることは申し訳なく思っていますが、どうすれば問題を解決できますか? – user3578925

+0

@ user3578925あなたは変数として必要なものを渡すことができ、仮引数に 'value'属性を使うことも、ローカルコピーを作成することもできます。私は最近、非常によく似た/役に立つ質問を見たことは確かですが、すぐに見つけることはできません。 – francescalus

+0

しかし、 'value'には明示的なインタフェースが必要です。 –

関連する問題