我使用英特尔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
我的错是什么?或者如果我是对的,那怎么可能是合理的呢?
答案 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
语句中重命名单个模块实体,从而将不同的名称与模块实体相关联。
如果在调用例程中包含被调用函数类型的(重新)声明,则会出现错误消息,因为编译器只允许声明被调用函数类型的一个声明。