2016-05-02 22 views
0

我有一个Fortran子程序希望像传递,如果一个复杂的阵列预计

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

后来一系列复杂我想这样称呼它

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

不过,我得到一个真正的数组编译器错误:

error #6633: The type of the actual argument differs from the type of the dummy argument.

当然,这是可以理解的,因为一个真正的数组不是一个复杂的数组。但是,必须有一种方法来使其工作。

因为如果子程序foofoo通话是在不同的模块,并在不同的Fortran文件都写下来,那么编译器抱怨,一切工作正常。

有人知道如何使它工作吗?如果预计复杂的数组如何传递实数组?

+0

您应该在主叫方显示更多代码。如果'rnumbers'不是一个虚拟参数,你可以将它与一个复杂的数组等价。 –

+0

不,'rnumbers'不是虚拟的,它是我用'real :: rnumbers(40)'创建的实际变量。顺便说一下,我正在使用英特尔Fortran编译器15.0.3。 – thyme

+0

如果你的子程序是外部的(没有显式接口),你的编译器不会检测到类型问题,它会正常工作。 – agentp

回答

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

+0

谢谢你的回答。但不幸的是我处理可分配数组。有没有解决方法指针左右?当涉及到非常大的阵列时,我认为使用'transfer'的解决方案是非常昂贵的。 – thyme

+0

@thyme **这就是为什么我要求你添加更多的调用代码!**为什么你根本无法做到这一点?我有点认为你发布的代码是不完整的,并添加了免责声明......你所做的唯一的事情就是你刚刚回答“rnumbers不是虚拟的,它是我用real :: rnumbers(40)创建的实际变量”即使它不是真的... –

+0

好吧,对不起,我太天真了。我想尽可能简化示例... – thyme