4

私は現在、関数を引数として渡すことをいじっています。

以下のプログラムでは、組み込み関数EXPを積分関数の引数として使用しています。コンパイラで次のエラーが表示されます。

integrate1.f90:22.26:

r = integral(-1.0,1.0,EXP,1000);
                      1
Error: Expected a procedure for argument 'f' at (1)

EXP変数の宣言での使用法をコメント解除すると、rこのエラーは発生しません。

したがって、組み込み関数を使用しないと、奇妙な引数として使用できないようです。「組み込み」の原因は、関数がロードされていることを示唆しています。

EXP関数を明示的に使用せずにこのエラーを防ぐにはどうすればよいですか? USE組み込みのものをロードするためにステートメントを使用する必要がありますか? これを回避する方法が他にない場合、これが Fortran の仕様によるものなのか、それともコンパイラの問題によるものなのかを知りたいですか?

を使用してGNU Fortran (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3います。

例:

MODULE MINTEGRATE
CONTAINS
FUNCTION integral(from,to,f,n)
    INTERFACE
        FUNCTION f(y); REAL, INTENT(IN) :: y; END FUNCTION
    END INTERFACE
    REAL :: from,to,integral,width;
    INTEGER :: n;

    width=ABS(to-from)/n;
    integral = 0.0;
    DO i=0,n
        integral = integral+f(from+width*i)*width;
    END DO
END
END

PROGRAM INTEGRATE
USE MINTEGRATE;

!PROCEDURE(EXP), POINTER :: f => EXP; ! using the variable f below works without error
REAL :: r!=EXP(0.0);
r = integral(-1.0,1.0,EXP,1000);
WRITE(*,*) r;
END
4

1 に答える 1

6

「組み込み関数がプロシージャに実引数として渡される場合、その特定の名前を使用する必要があり、呼び出される場合、その引数はスカラーである必要があります。すべての特定の組み込み関数が実引数として表示されるわけではありません。(詳細については、組み込み関数を参照してください。関数は実際の引数として許可されていません)。」インテル Fortran マニュアルより。

exp単精度実数のジェネリックの特定の名前も であるため、あなたは幸運でしたexpが、それ以外の場合は注意して正しい特定の関数を渡すか、ジェネリック名を呼び出す独自のラッパーを作成してください。たとえば、デフォルトの実対数が必要な場合は、 を使用する必要がありますalog

次の方法で、組み込み関数 exp を意味することをコンパイラに通知できます。

intrinsic exp

メインプログラムの宣言の間に配置されます。

于 2013-10-25T16:58:26.270 に答える