5

これが私の最小限の例です:

program test    
  implicit none
  real :: testfunc
  write(*,*) "Writing from main"
  write(*,*) testfunc()
end program test

function testfunc() result(y)
  real             :: y
  write(*,*) "Write from function g"
  y=1.0
  return
end function testfunc

シンプルにコンパイルする場合

gfortran test.f90

または Slatec のようなライブラリを含める場合

gfortran test.f90 -lslatec

それは正常に動作します。

ただし、ライブラリを -lblas の -llapack に変更すると、実行時に testfunc() を呼び出すときにプログラムがハングします。ここでのサンプル コードでは、実際にはこれらのライブラリを使用していないことに注意してください。私が最後に見たのは「メインからの書き込み」であり、何も起こらず、制御を取り戻すにはCTRL-Cを押す必要があります。ハングすると、プロセスは CPU サイクルを使用していないように見えます。

奇妙なことに、testfunc() 内の書き込みステートメントをコメントアウトすると、常に機能します。

だから私の質問は本当に: これらのライブラリは本当に自分の関数内での印刷を防ぐことができますか? なんで?どのように?

(私は実際に、lapack と blas を必要とするより大きなプログラムに取り組んでいるので、それらへのリンクをやめることはできません。)

4

1 に答える 1

9

私が覚えている限りでは、WRITE キーワードを再帰的に呼び出すことは標準に準拠していません。

プログラムを修正するには、メイン プログラムを少し変更します

program test    
  implicit none
  real :: testfunc,result
  write(*,*) "Writing from main"
  result=testfunc()
  write(*,*) result
end program test

私の新しい観点から、あなたが遭遇したトラブルは使用されたライブラリとは何の関係もありませんが、その場合、間違いの症状が変わる可能性があります(明らかにバグがないからクラッシュするまで)。

于 2011-10-05T14:05:44.667 に答える