在 Fortran 模块中重塑变量:将变量同时作为子例程的参数和 "use" 语句中的变量是否安全?

Reshaping variable in Fortran module: is it safe to have a variable both as argument of the subroutine and in the "use" statement?

我有一个模块,我在其中将二维数组(因为我的计算域是二维网格)存储为一维向量,因为我的代码中 99% 的其他子例程都使用一维向量。但是,我有一个与 2D arrays 一起使用的子程序 MYsubr ,并且由于我不知道有一种方法可以直接在 "use module" 内部将向量重塑为矩阵,所以我只是将它作为子例程的参数传递,然后重塑它在子程序中。有一个更好的方法吗? 我的模块是:

module myMODULE
   integer,allocatable :: var(:)
   .....
   ..... (thousands of other variables needed in mysubr)
end

并且主程序以"var"作为参数调用一个子例程,而且 var 也被模块 myMODULE 调用:

program main
   implicit none
   integer :: Nmax
   integer :: Mmax
   Nmax = 100
   Mmax = 200
    .....
   allocate(var(Nmax*Mmax))
    .....
    .....
   call MYsub(var,Nmax,Mmax)
end
subroutine MYsub(var,Nmax,Mmax)
   use myMODULE
   integer :: var(Nmax,Mmax)
    .....
    ....,
end 

这样我就可以重塑var。这有什么风险?它完美地编译。只要我不更改 MYsub 中 var 的值就可以了,如果我更改它会怎样?我应该在 MYsub 中使用这个公式更安全吗:

use myMODULE, unused => var

所以通过这种方式我避免了变量的别名。

首先我要说的是,如果您真的在单个子例程中使用模块中的数千个变量,那么在您的软件设计阶段就会出现可怕错误。

除此之外,如果您 use 在模块中而不是在子例程中

d 模块
module mod2
   use myMODULE

   contains

   subroutine MYsub(var,Nmax,Mmax)
      integer :: var(Nmax,Mmax)

现在会有问题,因为虚拟参数会隐藏主机关联的模块变量。

当您 use 子例程中的模块时,伪参数和使用相关实体的名称不能相同。您的重命名

use myMODULE, unused => var

符合标准,这样做没有风险。但是,为什么不以不同的方式命名虚拟参数呢?

在这种情况下,我不推荐指针重映射,虽然我在这里提出了它,但这是不必要的复杂化,并且还需要使用不同的名称。