【问题标题】:Pass a real array if a complex array is expected如果需要一个复数数组,则传递一个实数数组
【发布时间】:2016-05-02 08:01:53
【问题描述】:

我有一个 Fortran 子例程,它需要一个复杂的数组,例如

subroutine foo(cnumbers, n)
    integer :: n
    complex :: cnumbers(n)
    ...
end subroutine foo

后来我想这样称呼它

real :: rnumbers(40)
...
call foo(rnumbers, 20)

但是,我得到编译器错误:

错误 #6633:实际参数的类型与虚拟参数的类型不同。

当然,这是可以理解的,因为实数数组不是复数数组。但必须有办法让它发挥作用。

因为如果子例程foo 和foo 的调用在不同的模块中并且写在不同的Fortran 文件中,那么编译器确实不会 报错,并且一切正常。

有人知道如何让它工作吗?如果需要一个复杂的数组,如何传递一个实数数组?

【问题讨论】:

  • 您应该在调用方显示更多代码。如果rnumbers 不是虚拟参数,则可以将其与复杂数组等效。
  • 不,rnumbers 不是虚拟变量,它是我使用real :: rnumbers(40) 创建的实际变量。顺便说一句,我使用的是 Intel Fortran 编译器 15.0.3。
  • 如果您的子程序是外部的(没有显式接口),您的编译器将不会检测到类型问题并且它会正常工作。

标签: arrays fortran complex-numbers


【解决方案1】:

你可以使用transfer(rnumbers, ...)来转换类型(可能会创建一个临时数组)或使用等价来避免它

    real :: rnumbers(40)
    complex :: cnumbers(20)
    equivalence (rnumbers, cnumbers)

    set the value of rnumbers

    call foo(cnumbers, 20)

如果您需要可分配的数组,则等价将不起作用。

你也可以使用一个外部子程序,让编译器知道接口,只传递真正的数组而不是复杂的数组。它不符合标准,但有时会使用。另见Gfortran complex actual to real dummy argument

【讨论】:

  • 感谢您的回答。但不幸的是,我处理的是可分配数组。没有指针的解决方法吗?我猜想transfer 的解决方案对于非常大的数组来说太昂贵了。
  • @thyme 这正是我要求您添加更多调用代码的原因!您为什么不能这样做?我有点假设您发布的代码不完整并添加了免责声明...您所做的唯一一件事是您刚刚回答“rnumbers 不是虚拟的,它是我使用 real :: rnumbers(40) 创建的实际变量”即使它根本不是真的......
  • 好吧,对不起,我太天真了。我想使示例尽可能简单...
猜你喜欢
  • 2017-02-21
  • 2021-04-24
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 2010-12-14
相关资源
最近更新 更多