2012-04-19 20 views
0

私は2つのルーチンの違いは引数の順番でしかありませんが、私はそれらをインターフェイスで使いたいので、呼び出されたときに引数の順序に従って適切なものが呼び出されます。コンパイラはそれを区別することができないと訴えています。私の推測は、呼び出し時に名前付き引数の構文を使用すると、呼び出す引数が分からないためです。 1つの回避策は、引数に異なる名前を使用することですが、名前付き引数の呼び出しスタイルを無効にする方法があるのだろうかと思いました。名前付き引数の呼び出しを無効にすることはできますか?

例、これは私が

module Foo 

    interface Bar 
     module procedure Bar1 
     module procedure Bar2 
    end interface 

contains 
    subroutine Bar1(i,r) 
     integer, intent(in) :: i 
     real, intent(in) :: r 
     print *, "bar1" 
    end subroutine 
    subroutine Bar2(r,i) 
     real, intent(in) :: r 
     integer, intent(in) :: i 
     print *, "bar2" 
    end subroutine 

end module 

program fuux 
    use Foo 
    integer :: i 
    real :: r 

    r = 5.0 
    i = 3 

    call Bar(i,r) ! note that if I call Bar(i=i, r=r) the compiler cannot disambiguate 
        ! so it will complain at the interface statement 
end program 
+0

あなたがラップした場合、正しい理由がhttp://www.cs.rpi.edu/~szymansk/OOF90/bugs.html#10 –

答えて

1

を処理しようとしている状況である私はあなたが提案する何をする方法を知らない、というか私はあなたが句に示唆していると思うものを行うには「無効名前付き引数の呼び出しスタイル 'です。この答えが激怒したり、失望したり、不快になった場合は、コードを投稿してください(私はあまりにも多くの風と恵みがなく、まれにロイヤル "私たち"を使用していません)、狡猾なトリックを提案できるかもしれません君は。

EDIT

あなたの心にスプリングをやりたいする直接的な方法。最初の回避策は、barというサブルーチンを定義することです。このサブルーチンは一連の引数を標準的な順序で受け取り、適切な順序で引数を指定してbar1bar2(およびその他の定義可能なベビーbars)を呼び出します。

+0

であることを確認した後、 'bar'はバリアント型の2つの引数'整数型または実数型:ir'の型を調べ、適切なBarNを呼び出します。これはFortranでは不可能です。この問題は、静的型付けと名前付き引数の同時存在から発生します。 C++とJavaの両方が、おそらくこの理由のために、名前付き引数を避けています。 –

+0

ああ、それは私がステファノを考えているよりはるかに賢明です、私は 'bar'が整数と実引数を持ち、' ​​bar1'と 'bar2'にそれらのサブルーチンが望む順序で渡すと考えていました。しかし、無制限の多型(つまり 'class(*)')を宣言し、次に 'select type'構造を設定すると、引数の型をFortranでイントロスペクトできます。私はあなたに勧めなければならないと思います。 –

関連する問題