Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Fortran模块中重塑变量:在子例程的参数和;使用「;陈述_Fortran - Fatal编程技术网

在Fortran模块中重塑变量:在子例程的参数和;使用「;陈述

在Fortran模块中重塑变量:在子例程的参数和;使用「;陈述,fortran,Fortran,我有一个模块,其中我将2D数组(因为我的计算域是2D网格)存储为一维向量,因为代码中99%的其他子例程使用一维向量。但是,我有一个子例程MYsubr,它可以处理二维数组,因为我不知道如何在“use module”中直接将向量重塑为矩阵,所以我只是将其作为子例程的参数传递,然后在子例程中重塑它。有更好的方法吗? 我的模块是: module myMODULE integer,allocatable :: var(:) ..... ..... (thousands of other

我有一个模块,其中我将2D数组(因为我的计算域是2D网格)存储为一维向量,因为代码中99%的其他子例程使用一维向量。但是,我有一个子例程MYsubr,它可以处理二维数组,因为我不知道如何在“use module”中直接将向量重塑为矩阵,所以我只是将其作为子例程的参数传递,然后在子例程中重塑它。有更好的方法吗? 我的模块是:

module myMODULE
   integer,allocatable :: var(:)
   .....
   ..... (thousands of other variables needed in mysubr)
end
主程序以“var”作为参数调用子例程,但模块myMODULE也会调用var:

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

这样我就避免了变量的别名

首先,我想说,如果你真的在一个子程序中使用了来自一个模块的数千个变量,那么在你的软件设计阶段就出现了可怕的错误

除此之外,如果
使用
d,则在模块中而不是在子例程中使用模块

module mod2
   use myMODULE

   contains

   subroutine MYsub(var,Nmax,Mmax)
      integer :: var(Nmax,Mmax)
现在会出现问题,因为伪参数会隐藏与主机关联的模块变量

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

use myMODULE, unused => var
符合标准,这样做没有风险。但是为什么不直接用不同的名称命名伪参数呢


在这种情况下,我不建议重新映射指针,尽管我在这里提出了它,但这是一个不必要的复杂问题,而且还需要使用不同的名称。

首先,我想说,如果你真的在一个子例程中使用了来自一个模块的数千个变量,那么在软件设计阶段就会出现可怕的错误

除此之外,如果
使用
d,则在模块中而不是在子例程中使用模块

module mod2
   use myMODULE

   contains

   subroutine MYsub(var,Nmax,Mmax)
      integer :: var(Nmax,Mmax)
现在会出现问题,因为伪参数会隐藏与主机关联的模块变量

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

use myMODULE, unused => var
符合标准,这样做没有风险。但是为什么不直接用不同的名称命名伪参数呢


在这种情况下,我不建议重新映射指针,尽管我在这里提出了它,但这是一个不必要的复杂问题,而且还需要使用不同的名称。

首先,我想说,如果你真的在一个子例程中使用了来自一个模块的数千个变量,那么在软件设计阶段就会出现可怕的错误

除此之外,如果
使用
d,则在模块中而不是在子例程中使用模块

module mod2
   use myMODULE

   contains

   subroutine MYsub(var,Nmax,Mmax)
      integer :: var(Nmax,Mmax)
现在会出现问题,因为伪参数会隐藏与主机关联的模块变量

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

use myMODULE, unused => var
符合标准,这样做没有风险。但是为什么不直接用不同的名称命名伪参数呢


在这种情况下,我不建议重新映射指针,尽管我在这里提出了它,但这是一个不必要的复杂问题,而且还需要使用不同的名称。

首先,我想说,如果你真的在一个子例程中使用了来自一个模块的数千个变量,那么在软件设计阶段就会出现可怕的错误

除此之外,如果
使用
d,则在模块中而不是在子例程中使用模块

module mod2
   use myMODULE

   contains

   subroutine MYsub(var,Nmax,Mmax)
      integer :: var(Nmax,Mmax)
现在会出现问题,因为伪参数会隐藏与主机关联的模块变量

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

use myMODULE, unused => var
符合标准,这样做没有风险。但是为什么不直接用不同的名称命名伪参数呢



在这种情况下,我不建议重新映射指针,尽管我在这里提出了它,但这是一个不必要的复杂问题,还需要使用不同的名称。

在您的示例中,MYsub的接口不一致。在子例程中根本不使用模块,只需将数组作为参数传递即可。由于序列关联规则,您可以使用1d数组,并在子例程中将其视为2d数组。我知道,但很明显,我的模块中有一堆其他变量,我需要在MYsubr中使用这些变量,因此我需要使用该模块。我补充说。。。。。。(其他变量)正在模块中。我修正了参数,很抱歉,这是一个最小的例子,我忘记了它们。然后使用only子句只使用你需要的。或者使用指针重新映射并避免伪参数。如果您不直接访问模块变量,则可以使用带有模块变量别名的伪参数,请确保使用不同的名称,而不是
var
。非常感谢。无论如何,我需要数千个变量,并且用only子句列出它们是非常长的。所以我想我的想法是:“myMODULE,unused=>var”,对吗?而且据我所知,没有办法在模块中重塑变量。指针重新映射是否增加了开销?如果没有,你能举个例子吗?如果你愿意,我会接受你的回答。谢谢。此页面可能包含一些有用的信息(例如,数组指针的形状调整)。在您的示例中,MYsub的接口不一致。在子例程中根本不使用模块,只需将数组作为参数传递即可。由于序列关联规则,您可以使用1d数组,并在子例程中将其视为2d数组。我知道,但很明显,我的模块中有一堆其他变量,我需要在MYsubr中使用