是否有必要在任何调用例程中声明用户定义函数的类型?

Is It Necessary to declare the Type of User-Defined Functions in ANY Calling Routine?

我使用 Intel Visual Fortran。根据 Chapmann 的书,在调用它的例程中声明函数类型是必要的。但是看看这段代码,

module mod
implicit none
contains
function fcn ( i )
    implicit none
    integer :: fcn
    integer, intent (in) :: i
    fcn = i + 1
end function
end module

program prog
    use mod
    implicit none
    print *, fcn ( 3 )
end program

它在调用例程(此处为 prog)中没有该声明的情况下运行,实际上当我在程序 prog 或任何其他单元中定义其类型(我的意思是函数类型)时,它会出现此错误,

错误 #6401:此名称的属性与可通过 USE 语句访问的属性冲突。 [FCN] Source1.f90 15

我有什么错?或者,如果我是对的,那怎么证明呢?

您一定是在使用一本非常旧的查普曼的书,或者可能误解了其中的内容。当然,调用例程必须知道被调用函数的类型,在 Fortran-before-90 中,程序员有责任确保调用函数具有该信息。

但是,自从 90 标准和 modules 的引入以来,还有其他更好的方法可以向调用例程提供有关被调用函数的信息。其中一种方法是将调用的函数放入模块中,然后 use 关联模块。当您的程序遵循这种方法时,编译器会处理这些问题。这正是您的代码所做的,它不仅正确,而且是一个很好的方法,符合现代 Fortran 实践。

association 是 Fortran 标准,表示名称(例如 fcn)与实体关联的方式,例如调用的函数fcnuse-association是通过在程序单元中写use module实现的方式,从而使module中的所有名字都可以被使用[=10=的单元使用].一个简单的 use 语句使模块中的所有实体都以其模块定义的名称为人所知。 use 语句可以由 only 子句修改,这意味着只有一些模块实体可用。可以在 use 语句中重命名各个模块实体,从而将不同的名称与模块实体相关联。

如果在调用例程中包含被调用函数类型的(重新)声明,则会出现错误消息,因为编译器只允许被调用函数类型的一个声明。