是否有必要在任何调用例程中声明用户定义函数的类型?
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 标准和 module
s 的引入以来,还有其他更好的方法可以向调用例程提供有关被调用函数的信息。其中一种方法是将调用的函数放入模块中,然后 use
关联模块。当您的程序遵循这种方法时,编译器会处理这些问题。这正是您的代码所做的,它不仅正确,而且是一个很好的方法,符合现代 Fortran 实践。
association 是 Fortran 标准,表示名称(例如 fcn
)与实体关联的方式,例如调用的函数fcn
。 use-association是通过在程序单元中写use module
实现的方式,从而使module
中的所有名字都可以被使用[=10=的单元使用].一个简单的 use 语句使模块中的所有实体都以其模块定义的名称为人所知。 use
语句可以由 only
子句修改,这意味着只有一些模块实体可用。可以在 use
语句中重命名各个模块实体,从而将不同的名称与模块实体相关联。
如果在调用例程中包含被调用函数类型的(重新)声明,则会出现错误消息,因为编译器只允许被调用函数类型的一个声明。
我使用 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 标准和 module
s 的引入以来,还有其他更好的方法可以向调用例程提供有关被调用函数的信息。其中一种方法是将调用的函数放入模块中,然后 use
关联模块。当您的程序遵循这种方法时,编译器会处理这些问题。这正是您的代码所做的,它不仅正确,而且是一个很好的方法,符合现代 Fortran 实践。
association 是 Fortran 标准,表示名称(例如 fcn
)与实体关联的方式,例如调用的函数fcn
。 use-association是通过在程序单元中写use module
实现的方式,从而使module
中的所有名字都可以被使用[=10=的单元使用].一个简单的 use 语句使模块中的所有实体都以其模块定义的名称为人所知。 use
语句可以由 only
子句修改,这意味着只有一些模块实体可用。可以在 use
语句中重命名各个模块实体,从而将不同的名称与模块实体相关联。
如果在调用例程中包含被调用函数类型的(重新)声明,则会出现错误消息,因为编译器只允许被调用函数类型的一个声明。