Fortran-模块子例程参数意图混淆-INOUT与OUT

1快速提问

可以说有一个向量:

REAL(KIND=dp), DIMENSION(maxn) ::  rho

它是在初始子程序(以及dpmaxn)中分配的值,并从主程序中调用。

然后,主程序调用一个模块,该模块包含一个(不同的)子例程进行演化rho的子例程参数rho定义为:

SUBROUTINE sum_density(a, b, c, ....., rho)

在此子例程中,rho声明为:

REAL(KIND=dp), DIMENSION(maxn), INTENT(OUT)  ::  rho   

但是,在将任何值与关联之前,代码包含以下行rho

foo1= foo2*foo3(i)/rho(i)

我以为模块子例程将无法访问rho主程序中定义。我希望编译器抱怨并要求将意图更改为(INOUT)或说rho未定义之类的内容。即使我确实将其更改为结果(INOUT)也没有差异。rho即使意图声明为,模块子例程也必须正在主程序中访问并使用它的值OUT

我的问题是-在这种情况下,使用inINTENT(OUT)和the和有INTENT(INOUT)什么区别

弗拉基米尔F

对于该INTENT(OUT)程序该程序不符合标准,因为它访问具有未定义值的数组。

但是,由于通常通过显示数组的地址来实现显式形状数组,因此软件实现可能会起作用。如果您传递的数组是非连续的,则可以说

  rho(::2)

编译器很可能会创建一个副本,该副本会传递给您,并且您可能会遇到问题,因为该数组可能包含带有的垃圾intent(out)

关于警告,它们不是强制性的,但是如果您使用诸如-warn或的标志,则编译器会对此发出警告-Wall

对于intent(in)差异,当您尝试修改时会出现rho如果尝试编译器必须发出错误。

关于范围:

在这里谈论范围并不是真的正确,原始rho的绝对不在子程序的范围内,只有哑元参数才是。重复使用相同名称可能会造成混淆。想象一下,它们实际上是rho1在程序和rho2子例程中调用的。那么很明显,这rho1不在子例程的范围内,而是在子例程的范围内rho2

现在,rho2不能保证具有相同的价值rho1在与子程序的开始intent(out),但它保证能够拥有它intent(inout)原因是可以使用copy-in和copy-out来实现参数传递,而对于则可以省略copy-in intent(out)

考虑以下代码:

module m
contains
  subroutine sub(a2)
    real, intent(out) :: a2(4)
    print *,a2
    a2 = 2
  end subroutine
end

  use m

  real :: a1(8)

  a1 = 1

  call sub(a1(::2))

end

对于某些编译器,它会像预期的那样打印四次,而对于其他编译器或某些编译器参数,它会打印垃圾:

sunf90 intent2.f90 
./a.out 
 5.879759E-39 0.0E+0 0.0E+0 0.0E+0

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Fortran-模块子例程参数意图混淆-INOUT与OUT

来自分类Dev

fortran模块的子例程名称冲突

来自分类Dev

有效程序,显示Fortran中intent(out)和intent(inout)之间的差异

来自分类Dev

Fortran:将任意“结构”传递给模块子例程

来自分类Dev

在Fortran 90中的模块内部使用子例程

来自分类Dev

带有子模块的Fortran子例程重载

来自分类Dev

R调用Fortran子例程

来自分类Dev

如何编译Fortran子例程

来自分类Dev

Fortran语法(子例程的声明)

来自分类Dev

IN,OUT或INOUT对过程中的参数无效

来自分类Dev

FORTRAN:将伪参数传递给子例程

来自分类Dev

R使用字符参数调用Fortran子例程

来自分类Dev

Fortran子例程/函数参数名称和声明

来自分类Dev

FORTRAN:将伪参数传递给子例程

来自分类Dev

FORTRAN 77中子例程参数的范围

来自分类Dev

从C ++调用FORTRAN子例程会产生非法的参数值

来自分类Dev

例程 [procedurename] 的存储过程错误 OUT 或 INOUT 参数 1 不是 BEFORE 触发器中的变量或 NEW 伪变量

来自分类Dev

从R调用并行的fortran MPI子例程

来自分类Dev

在Fortran子例程中读取许多文件

来自分类Dev

Fortran子例程值关键字

来自分类Dev

fortran子例程:任意类型的数组

来自分类Dev

在fortran的子例程中更新数组的值

来自分类Dev

在Fortran子例程中分配数组

来自分类Dev

从C#调用FORTRAN子例程

来自分类Dev

Fortran将数字传递给子例程

来自分类Dev

如何在C语言中使用fortran模块子例程

来自分类Dev

如何在C语言中使用fortran模块子例程

来自分类Dev

Fortran是否通过子例程多次调用来修改输入参数?

来自分类Dev

f2py。多行上的fortran子例程参数。“ unknown_subroutine”

Related 相关文章

热门标签

归档