如果需要复杂数组,则传递一个真实数组

时间:2016-05-02 08:01:54

标签: arrays fortran complex-numbers

我有一个Fortran子程序,需要一个像

这样的复杂数组
subroutine foo(cnumbers, n)
    integer :: n
    complex :: cnumbers(n)
    ...
end subroutine foo

后来我想把它称为

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

但是,我收到编译错误:

  

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

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

因为如果子例程foofoo的调用在不同的模块中并且写在不同的Fortran文件中,那么编译器会抱怨,并且一切工作正常。

有人知道如何让它发挥作用吗?如果需要复杂数组,如何传递真实数组?

1 个答案:

答案 0 :(得分:2)

您可以使用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