2011-10-18 11 views
3

の配列にスカラー式を宣言しますが、プロシージャーの引数としてスカラー式を宣言しないのはなぜですか?特に、標準化団体がこの設計決定をしたのはなぜですか?プロシージャが過負荷になっている場合は、あいまいさのためだけですか?その状況でのエラーメッセージが別の方法ですか?Fortranの配列へのスカラー引数の持ち上げがありません

たとえば、次のコードでは、最後の文x = foo(7)は、GFortranエラー:Error: Rank mismatch in argument 'a' at (1) (1 and 0)を生成します。

module m 

    public :: foo 

    contains 

    function foo(a) result(b) 
    integer, dimension(:)  :: a 
    integer, dimension(size(a)) :: b 
    b = a+1 
    end function foo 

end module m 

program p 

    use m 

    integer, dimension(4) :: x 
    integer, parameter, dimension(4) :: y = (/1,2,3,4/) 

    x = 7 
    x = foo(x) 
    x = foo(y) 
    x = foo(x + 7) 
    x = foo(7) 

end program p 

この質問では、配列割り当てがスカラー値ソースを配列ターゲットに昇格させる理由について質問する必要があります。配列関数とは異なります。私はそれが単に便利な特別なケースだと思う。下の口頭で感謝していただいたコメント。

答えて

4

スケーラーと配列の引数を関数で処理する場合は、それを「要素」とスカラーダミー引数で宣言します。次に、スケーラー式を含むスケーラーと配列の両方の実引数を扱うことができます。それはあなたの必要を満たすでしょうか?

変更:

elemental function foo(a) result(b) 
    integer, intent (in)  :: a 
    integer :: b 
    b = a+1 
    end function foo 

はおそらく、彼らはあなたが望むものを行うための方法を提供し、一つの方法は十分でしたか?

+0

これは、基本的には機能が何をすることができるかについて多くの制約を課すため、OPが望むほど一般的ではありません。 – bdforbes

+0

もちろんです。ほとんどの組み込み関数は要素ではありません。また、スカラーを配列に昇格させるためには、要素関数に> 1が必要です。私の質問はスカラーを宣伝する代入ステートメントに焦点を当てた方が良いでしょう。しかし、それは理にかなっています:割り当てステートメントは特別です。私は最近、あまりAPLを見ています... – user2023370

3

明示的なインターフェイス(モジュールプロシージャを使用すると自動的に取得する)でFortranを呼び出すには、TKR(型、種類、ランク)が一致する必要があります。配列はスカラーとは異なる型であり、ランクの不一致はもちろんではありませんが、これは許されません。

手順が過負荷になるとあいまいさがありますか?

これは問題です。はい。

この場合、エラーメッセージが表示されますか?

ピンクのユニコーンが存在しますか?たぶん、私の知っている限り、彼らはしません。 IOWでは、現在Fortran標準ではTKRのマッチングが必要です。したがって、標準に準拠したコンパイラがこの要件を強制しなければなりません。変更したい場合は、標準化委員会に提案することをお勧めします。

+0

ありがとうございます。私はあなたの答えをありがとうが、私は実際に "なぜ"を探しています。 – user2023370

0

私はこれに対する答えがかなり明確だと思います。例を少し変更しましょう:

module m 

    public :: foo 

    contains 

    function foo(a) result(b) 
    integer, dimension(:)  :: a 
    integer, dimension(size(a)) :: b 
    b = a+1 
    a(2) = -777  ! new line; modify one element 
    end function foo 

end module m 

program p 

    use m 

    integer :: x 
    integer, dimension(4) :: y 

    x = 7 
    y = foo(x) ! pass a scalar 

end program p 

xはfooの呼び出し後になるはずです。

さて、必ず、あなたはそれがintent(in)変数だかどうかに応じて、変更を渡す引数の意味を持つことができ、それはプログラマのための物事を明確にに起こっているないものです。

もし関数呼び出しが何らかの形で配列要素の上に「分配」されるとすれば、MSBは指摘するように、要素的な方法があります。それ以外の場合は、引数が自分のパラメータと一致するかどうかを確認します。

+0

ありがとうございます。議論は意図的であると思っていた。そのため、 'parameter'引数' y'をインクルードしました。あなたが言うように、「要素」は道のりです。 – user2023370

関連する問題