10

pgf90 7.2でのpresent()組み込み関数の動作を理解していません。これをテストするために20行のサンプルプログラムを作成しましたが、結果はまだ意味がありません。観察:


subroutine testopt(one,two,three,four,five)

  implicit none

  integer, intent(in) :: one,two
  integer, intent(out) :: three
  integer, intent(in), optional :: four
  integer, intent(out), optional :: five

  three = one + two

  print *,"present check: ",present(four),present(five)

  if (present(four) .and. present(five)) then

  five = four*four

end if

end subroutine testopt

メインプログラムからtestopt(1,2、(any variable))を呼び出すと、「present check:TF」と出力されます。ただし、I:サブプログラムからtestopt(1,2、(any variable))を呼び出すと、「present check:TT」と出力されます。どちらの場合も「presentcheck:F F」が表示されると予想しました。これは、オプションではない3つの引数のみを使用してサブルーチンを呼び出しており、オプションの引数はどちらも呼び出していないためです。なぜこのように動作するのか理解できず、これが私が取り組んでいるプログラムに大きなバグを引き起こしています。洞察に感謝します。ありがとう。

4

2 に答える 2

9

このサブルーチンをモジュールに配置し、呼び出しルーチン (メイン プログラムまたはサブルーチン) でそのモジュールの "use" ステートメントを使用していますか? Fortran 90 の高度な機能や新しい機能の多くは、呼び出し元と呼び出し先の両方が一貫して引数を渡すように、明示的なインターフェイスを必要とするのが一般的なルールです。これを達成するための最も簡単で最良の方法は、module / use を使用することです。推測ですが...

于 2010-06-26T04:44:02.037 に答える