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

3 に答える 3

4

関数でスケーラーと配列の引数を処理する場合は、それを「要素」として宣言し、スケーラーの仮引数を指定します。次に、スケーラー式を含む、スケーラーと配列の実引数の両方を処理できるようになります。それはあなたのニーズを満たしますか?

変化:

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

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

于 2011-10-18T12:52:08.020 に答える
3

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

手順をオーバーロードする必要があるのはあいまいさのためですか?

それは問題になるでしょう、はい。

そのような状況でのエラーメッセージは別のアプローチでしょうか?

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

于 2011-10-18T10:45:00.403 に答える
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

foo を呼び出した後の x は何ですか?

intent(in)確かに、それが変数であるかどうかに応じて、引数を渡すセマンティクスを変更することはできますが、それはプログラマーにとって物事を明確にするものではありません。

関数呼び出しが何らかの方法で配列要素に「分散」することになっている場合、MSB が指摘するように、要素は行く方法です。それ以外の場合は、自分の引数が自分のパラメーターと一致することを確認するだけです。

于 2011-10-18T17:48:31.943 に答える