1

次のコード構造があります。

PROGRAM main

  IMPLICIT NONE

  REAL*8, DIMENSION(:), ALLOCATABLE :: var

  ALLOCATE(var(3))

  var(1) = 1.0d0
  var(2) = 2.0d0
  var(3) = 3.0d0

  CALL f1(var, f2)

  CONTAINS

  SUBROUTINE f1(arg_in, fun)

    REAL*8, DIMENSION(:), INTENT(IN) :: arg_in
    EXTERNAL fun

    PRINT *, arg_in

    CALL fun(arg_in)

    PRINT *, arg_in

  END SUBROUTINE f1

  SUBROUTINE f2(arg_in)

    REAL*8, DIMENSION(:), INTENT(INOUT) :: arg_in

    PRINT *, SIZE(arg_in)

    arg_in = 2.0d0 * arg_in

    RETURN

  END SUBROUTINE f2

END PROGRAM main

プログラムを実行すると、関数 f2 の配列のサイズが 0 であることに気付きました。実際のプログラムでは、上記の単純なプログラムとは対照的にエラー メッセージが表示されますが、同じ問題があります。

ターゲットに関連付けられていないポインター F を使用しようとしました

何が問題なのか、誰かがヒントを与えることができますか?

4

1 に答える 1

4

サブルーチンを外部として渡しますが、想定された形状の仮引数があるため、明示的なインターフェイスが必要です。プロシージャを使用して指定する必要があります

procedure(f2) :: fun

またはインターフェースブロック

interface
  SUBROUTINE fun(arg_in)
    REAL*8, DIMENSION(:), INTENT(INOUT) :: arg_in
  end
end interface

その後、それがf2配列を変更することにも気付くでしょう。したがって、配列を として持つarg_inから参照することは違法です。f1arg_inintent(in)

于 2013-10-25T07:44:39.117 に答える