Fortran 是否可以禁用命名参数调用?

Fortran 是否可以禁用命名参数调用?,fortran,fortran90,Fortran,Fortran90,我有两个例程,它们的区别仅在于参数的顺序,但我希望通过接口使用它们,以便在调用时根据参数的顺序调用适当的例程。编译器抱怨它无法区分它们,我猜是因为如果我在调用时使用命名参数的语法,它将不知道调用哪个参数。一种解决方法是为参数使用不同的名称,但我想知道是否有办法禁用命名参数调用样式 例如,这就是我试图处理的情况 module Foo interface Bar module procedure Bar1 module procedure Bar2

我有两个例程,它们的区别仅在于参数的顺序,但我希望通过接口使用它们,以便在调用时根据参数的顺序调用适当的例程。编译器抱怨它无法区分它们,我猜是因为如果我在调用时使用命名参数的语法,它将不知道调用哪个参数。一种解决方法是为参数使用不同的名称,但我想知道是否有办法禁用命名参数调用样式

例如,这就是我试图处理的情况

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

我不知道有什么方法可以做到你所建议的,或者更确切地说,可以做到你在短语“禁用命名参数调用样式”中所建议的。如果这个答案激怒了你,让你失望或不高兴,那么发一些代码,我们(我的意思是,我没有太多的架子和优雅,很少使用王室的“我们”)可能会建议一个狡猾的把戏,让你高兴

编辑


没有直接的方法去做你想做的事情。我遇到的第一个工作循环是定义一个名为
bar
的子例程,它以规范的顺序接受一系列参数,并以适当的顺序调用
bar1
bar2
(以及您想要定义的任何其他婴儿
bar
),然后,
bar
需要接受两个变量类型的参数
integer或real::ir
,反思它们的类型,并调用相应的BarN,这在fortran中是不可能的。这个问题源于同时存在静态类型和命名参数。C++和java都能避开命名参数,这可能是因为这个原因。噢,这比我想象的要聪明得多,我认为 Bar < /Calp>会有一个整数和一个实数的参数,并将它们按照子程序的顺序传递给<代码> BAR1和<代码> BAR2。但是您可以在Fortran中内省参数的类型,如果您将其声明为无限制多态(即
class(*)
),则可以设置
select type
构造。提醒你,我不是建议你应该这么做。你说的对