Fortran 模块使用错误
fortran module use wrong
以下是VASP的代码框架。我的工作是将它移植到一个新平台上。当我使用那个平台的编译器时,我得到了错误。如果我注释掉 use m
并且我还得到“它必须指定一个显式接口。”我只想进行最少的修改以避免在其他部分产生错误该程序。
module m
interface
subroutine a
end subroutine
end interface
interface
subroutine b
end subroutine
end interface
end module
subroutine a
use m
call b
end subroutine
为什么不简单:
module m
contains
subroutine b
! code
end subroutine b
subroutine a
! code
call subroutine b
end subroutine a
end module m
从你发布的内容来看,我没有看到任何递归(子例程都没有调用自身,a
调用 b
但 b
没有调用 a
) 也不需要它。我也不认为需要显式编写 interface
块;将子程序打包成一个模块,让编译器负责检查接口规范和协议。
在所示代码中,模块中定义的子例程 a
的接口可通过使用关联在子例程 a
中访问。因为子程序已经为它定义的任何过程定义了一个显式接口,这意味着您有两个单独定义的显式接口,用于在同一范围内访问的同一过程。这违反了语言规则(F2008 12.4.3.2p7)。
您可以在 USE 语句中使用 ONLY 子句来排除子例程接口的接口体变体,使其无法通过子例程内部的 use 关联访问。
module m
interface
subroutine a
end subroutine
end interface
interface
subroutine b
end subroutine
end interface
end module
subroutine a
use m, only: b
call b
end subroutine
以下是VASP的代码框架。我的工作是将它移植到一个新平台上。当我使用那个平台的编译器时,我得到了错误。如果我注释掉 use m
并且我还得到“它必须指定一个显式接口。”我只想进行最少的修改以避免在其他部分产生错误该程序。
module m
interface
subroutine a
end subroutine
end interface
interface
subroutine b
end subroutine
end interface
end module
subroutine a
use m
call b
end subroutine
为什么不简单:
module m
contains
subroutine b
! code
end subroutine b
subroutine a
! code
call subroutine b
end subroutine a
end module m
从你发布的内容来看,我没有看到任何递归(子例程都没有调用自身,a
调用 b
但 b
没有调用 a
) 也不需要它。我也不认为需要显式编写 interface
块;将子程序打包成一个模块,让编译器负责检查接口规范和协议。
在所示代码中,模块中定义的子例程 a
的接口可通过使用关联在子例程 a
中访问。因为子程序已经为它定义的任何过程定义了一个显式接口,这意味着您有两个单独定义的显式接口,用于在同一范围内访问的同一过程。这违反了语言规则(F2008 12.4.3.2p7)。
您可以在 USE 语句中使用 ONLY 子句来排除子例程接口的接口体变体,使其无法通过子例程内部的 use 关联访问。
module m
interface
subroutine a
end subroutine
end interface
interface
subroutine b
end subroutine
end interface
end module
subroutine a
use m, only: b
call b
end subroutine