7

Fortanでは、要素サブルーチンにインテント(inout)とインテント(out)引数を持たせることができますが、要素関数はインテント(in)のみ可能です。Fortran要素関数と要素サブルーチン

なぜですか?それは単なる文法的なコンベンションですか、あるいは、関数の呼び出しとサブルーチンの呼び出しについて一般的に異なるものがありますか?

すなわち

Elemental Integer Function FOO(i) 
    Integer, intent(in) :: i 
    ... 
    FOO=something 
End Function 

Elemental Subroutine FOO(i, v) 
    Integer, intent(in) :: i 
    Integer, intent(out) :: v 
    ... 
    v=something 
End Subroutine 

— FOOのこれらの実装は等価的に効率的ですか?

+0

私はそれを理解することはできません、それは副作用がある場合、それを純粋な手順と呼ぶのはあまり意味がありません。私は推測を危険にさらし、要素関数が並列化の文脈においてより効率的であるかもしれないと言うことで、プロシージャがどのように動作するかをコンパイラに明確にしている。 – bdforbes

+0

私は、サブルーチンがそれ自身の引数だけを変更し、グローバル変数に触れなければ、そのようなサブルーチンを効率的にコンパイルすることは難しくないと思います。このような機能を持つことは理にかなっています。たとえば、乱数ジェネレータは、乱数シーケンスの状態(整数の配列で記述)を変更し、乱数を返す必要があります。したがって、それは1つのインテント(inout)と1つのインテント(out)引数を持つ必要があります。確かに、ユーザは、共有変数をそのようなサブルーチンに渡すことによって物事を混乱させる可能性があります。しかし、もう一度、プログラミングのパラダイムは愚かではありません。 – drlemon

答えて

6

何らかの理由で結果を渡す必要があるので、少なくとも1つの引数intent(out)またはintent(inout)がない要素サブルーチンを持つことに意味はありません。関数には戻り値があり、サブルーチンでは引数を使用する必要があります。 Fortran 2008のAFAIKの要素手続きは純粋である必要はありませんが、副作用だけで有用な要素サブルーチンを想像するのは難しいです。

関連する問題