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

时间:2015-01-12 04:35:29

标签: fortran

我使用英特尔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

我的错是什么?或者如果我是对的,那怎么可能是合理的呢?

1 个答案:

答案 0 :(得分:2)

你必须使用Chapman书籍的旧版本,或者可能误解了它所说的内容。当然,调用例程必须知道被调用函数的类型,而在Fortran-before-90中,程序员有责任确保调用函数具有该信息。

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

association 是Fortran-standard-speak,用于表示名称(例如fcn)与实体关联的方式,例如名为fcn的函数。 use-association 是通过在程序单元中编写use module来实现的方式,从而使module中的所有名称都可用于使用module的单元。一个简单的use语句使模块中的所有实体都以模块定义的名称知道。 use语句可以通过only子句进行修改,这意味着只有一些模块实体可用。可以在use语句中重命名单个模块实体,从而将不同的名称与模块实体相关联。

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