4

OPTIONALFortran 95 の関数とサブルーチンのステートメントに問題があります。現在、Silverfrost の Plato とその FTN95 コンパイラ ("Release Win32" モード) を使用しています。私が書いているより複雑なプログラムで OPTIONAL ステートメントを実装しようとした後、それをテストするための非常に単純なプログラムを作成しました。コードは次のとおりです。

program TEST

implicit none
integer :: a=1, b=2

call Z(a,b)
call Z(a)
call Z(b)

end program TEST

subroutine Z(x,y)
implicit none
integer :: x
integer, optional :: y

if (present(y)) then
  write(*,*) x, y
  else
    write(*,*) x
endif

end subroutine Z

画面に次の結果が表示されることを期待していました。

1 2
1
2

コードはコンパイルされますが、「SUBROUTINE Z が呼び出された引数が少なすぎます」という警告 (673) が表示されます。それを実行した後、私は自分の画面に行きます:

1 2

その後、「アクセス違反」エラー メッセージが表示されます。誰かがここで何が悪いのか理解できますか?

どうもありがとう!ジルベルト

4

2 に答える 2

9

次のように、サブルーチンをモジュールに入れてみてください。

module testoptional
contains
    subroutine Z(x,y)
    implicit none
    integer :: x
    integer, optional :: y

    if (present(y)) then
      write(*,*) x, y
      else
        write(*,*) x
    endif

    end subroutine Z
end module testoptional

program TEST
    use testoptional
    implicit none
    integer :: a=1, b=2

    call Z(a,b)
    call Z(a)
    call Z(b)

end program TEST

コンパイルして実行すると、gfortran と ifort を使用して期待される結果が得られます。

問題は、メイン プログラムが へのインターフェイスをどのように認識 (または推測) するかにありますZ(x,y)。あなたが提供するコードでは、メインプログラムとサブルーチンは同じファイルにありますが、メインプログラムにインターフェイス (引数の数、型などを含む呼び出しシーケンス) を明示的に伝えるものは何もありませんZ。最初の呼び出しは に対するものZ(a,b)であるため、2 つのパラメーターを受け取るサブルーチンがどこかにあると推測されます。次に、1 つのパラメーターで呼び出しを試みますが、失敗します。

サブルーチンをモジュールに入れ、モジュールを使用すると (contains含まれるサブルーチンに使用することも、ブロックを使用して明示的/手動でメイン プログラムにインターフェイスを提供することもできinterfaceます)、呼び出しシーケンスについて必要な情報がメイン プログラムに提供されます。 、オプションの引数があり、物事が正しく機能すること。

于 2013-08-18T15:18:33.277 に答える
3

オプションの引数を持つプロシージャには明示的なインターフェイスが必要ですZ。(たとえば、短いモジュールのサブルーチンを使用するだけです。)

この特定のコンパイラは手元にありませんが、このような場合に Cray コンパイラを使用するとエラーが発生しました。

于 2013-08-18T15:18:47.390 に答える