1

問題

関数を別の関数の引数にしようとしていますが、エラーが発生し続けます:

Error: Internal procedure 'polytrope' is not allowed as an actual argument at (1)

コード

以下は、関数を呼び出し、実際のコールバックを含むプログラムのベアボーン バージョンです。

PROGRAM testbutcher
  USE butcher
  IMPLICIT NONE

  REAL :: t = 0, dt = 0.01
  REAL, DIMENSION(2) :: v0 = (/ 1.0, 0.0 /), fargs = (/ 1.0, 1.0 /)

  v0 = step(polytrope, v0, 2, t, dt, fargs)

  CONTAINS

  FUNCTION polytrope(v0, t, fargs) result(v1)
    REAL, DIMENSION(:) :: fargs
    REAL, DIMENSION(2) :: v0, v1
    REAL               :: t

    v1 = t * v0
    RETURN
  END FUNCTION

END PROGRAM

次に、関数引数を取る関数が次のモジュールです。

MODULE butcher
  IMPLICIT NONE

  CONTAINS

  FUNCTION step(fxn, v0, n, t, dt, fargs) RESULT(v1)
    REAL, DIMENSION(n)           :: v0, v1
    REAL, DIMENSION(:)           :: fargs
    REAL, DIMENSION(tn,tm)       :: tab
    REAL                         :: t, dt
    INTEGER                      :: n, tn, tm
    INTERFACE
      FUNCTION fxn(v, t, fargs)
        REAL, DIMENSION(:), INTENT(in) :: v
        REAL, DIMENSION(:), INTENT(in) :: fargs
        REAL, INTENT(in)               :: t
      END FUNCTION
    END INTERFACE

    v1 =  fxn( v0,      &
               t + dt,  &
               fargs    &
             )

    RETURN
  END FUNCTION

END MODULE

概要

したがって、基本的に、testbutcher には特別な方法で評価される関数が含まれているため、モジュール butcher (具体的には butcher の関数ステップ) に送信して評価されます。これを実際に行う方法がわかりません!私が C で作業していた場合、単純に polytrope へのポインターを作成し、それを fxn にスローします。

4

2 に答える 2

2

関数ステップでは、fxn への入力を INTENT(IN) のものとして定義しますが、関数ポリトロープで意図を宣言しません。また、fxn の戻り値の型は指定されていないため、暗黙的に定義されており、"REAL, DIMENSION(2)" とは互換性がありません。このエラーをキャッチするには、コードにさらにいくつかの「IMPLICIT NONE」宣言が必要だと思います。

于 2010-12-13T22:07:15.670 に答える
0

これは、MS Fortran、Digital Fortran、Intel Fortran、および gfortran のすべてで過去に機能したものです。

  1. 関数をそれを使用するモジュールの外部として宣言します。
  2. モジュールの外側で適切な関数を宣言します (独自のファイルに入れることもできます)。

これは、すべてのプログラムでライブラリから呼び出される「使用法」サブルーチンを宣言するために使用するものです。ステートメントも使用しない限り、コンパイラは関数のシグネチャが正しいことを確認しない可能性がありますINTERFACE(これは悪い考えではありません)。

PROGRAM testbutcher
  USE butcher
  IMPLICIT NONE
  EXTERNAL polytrope  !!!!!


  REAL :: t = 0, dt = 0.01
  REAL, DIMENSION(2) :: v0 = (/ 1.0, 0.0 /), fargs = (/ 1.0, 1.0 /)

  v0 = step(polytrope, v0, 2, t, dt, fargs)

  CONTAINS
END PROGRAM
!!!!!
FUNCTION polytrope(v0, t, fargs) result(v1)
  REAL, DIMENSION(:) :: fargs
  REAL, DIMENSION(2) :: v0, v1
  REAL               :: t

  v1 = t * v0
  RETURN
END FUNCTION
于 2010-12-30T01:17:37.130 に答える