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 调用 bb 没有调用 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