首页 文章

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

提问于
浏览
0

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

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

后来我想称之为

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

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

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

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

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

有人知道如何使它工作吗?如果期望复杂数组,如何传递真实数组?

1 回答

  • 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

相关问题