2

FORTRAN ファイル「testValueKeyword.for」に次のコードが含まれています

  subroutine intersub2(x,y)
    integer, value ::  x
    integer y
    x = x + y
    y = x*y
  print *, 'in subroutine after changing: ', x, y
  end subroutine

  program testValueKeyword
    integer :: x = 10, y = 20
    print *, 'before calling: ', x, y
    call intersub(x, y)
    print *, 'after calling: ', x, y
    x = 10
    y = 20
    call intersub2(x, y)
  contains
  subroutine intersub(x,y)
    integer, value ::  x
    integer y
    x = x + y
    y = x*y
    print *, 'in subroutine after changing: ', x, y
  end subroutine
  end program

サブルーチン intersub と intersub2 には同じコードが含まれており、どちらも x 引数を値で渡しますが、intersub2 はメモリ アドレスに似た大きなランダム整数を渡しているようです。実行後に異なるy値を取得します。これを説明していただけますか?

4

2 に答える 2

7

サブルーチンintersub2 をモジュールに配置し、useそのモジュールを呼び出し元 (ここでは testValueKeyword プログラム) から呼び出して、呼び出し元が使用する呼び出し規約を「認識」できるようにします。Fortran >=90 の「高度な」引数機能をプロシージャ (サブルーチンまたは関数) で使用する場合、呼び出し元がプロシージャと同じインターフェイス/呼び出し規約を使用するように、インターフェイスを呼び出し元に対して明示的にする必要があります。そうしないと、呼び出し元と呼び出し先の間の不一致により、両者の間で「ランダムな」通信が発生します。インターフェイスを認識させる最も簡単な方法は、プロシージャをモジュールとuseそのモジュールに配置することです。で手順を説明することもできますが、interfaceそれは手間がかかり、2 番目に維持する必要があります。

広範な警告オプションを使用して gfortran でコードをコンパイルすると、gfortran は問題についても教えてくれます。

call intersub2(x, y)
                  1
Error: Dummy argument 'x' of procedure 'intersub2' at (1) has an attribute that requires an explicit interface for this procedure

gfortran を使用している場合は、デバッグ用に次のコンパイラ オプションを試してください。-O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fwhole-file -fcheck=all -std=f2008 -pedantic -fbacktrace

于 2013-09-30T18:11:14.877 に答える
0

MSB が言うように、プログラムは何がtestValueKeyword何でintersub2あるかを認識していないため、ジャンク データを取得しても驚くことではありません。

を書くという MSB の提案の代わりに、プログラムの一部を挿入して正しい結果を得ることMODULEができます。intersub2CONTAINS

于 2013-09-30T18:15:23.040 に答える