0
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

同じコードのバージョンがここにアップロードされます。

これは私が思いつくことができる最小限の例です。これにより、gfortran を使用して実行可能ファイルを実行すると、また Web サイトでもセグメンテーション エラーが発生します。

4

1 に答える 1

2

ダミー引数aおよびbは、定数である実際の引数に関連付けられています。定数は定義できません-プログラムは「3.0d0」または「4.0d0」の値を変更しようとしています。もしあなたのプログラムが成功したとしたら、宇宙全体に混乱が起こります。

私は強くお勧めします:

  • モジュール手順を使用します。これにより、コンパイラは実際の引数がダミーの引数と一致していることを確認できます。
  • ダミー引数の定義にINTENT仕様を使用します。これにより、コンパイラーは、変更可能である必要があるものが変更可能であり、変更できない可能性があるものがそうではないことを確認できます。

問題の回避策は、3.0d0と4.0d0の初期値を保持する適切な変数をメインプログラムに含め、それらの変更可能な変数をサブルーチンに渡すことです。または、サブルーチン内にダミー引数の一時的なコピーを作成することもできます。F2003では、VALUE属性を使用してこれを自動的に行うことができます。

その間、すべてのスコープでIMPLICITNONEを使用してください。いつも。

于 2013-02-11T19:51:58.997 に答える