2010-11-18 66 views
12

FFTW手册says它的fftw_complex类型是位兼容到STL的std::complex<double>类。但是,这并不为我工作:问题铸造STL复杂<double> fftw_complex

#include <complex> 
#include <fftw3.h> 
int main() 
{ 
    std::complex<double> x(1,0); 
    fftw_complex fx; 
    fx = reinterpret_cast<fftw_complex>(x); 
} 

这给了我一个错误:

error: invalid cast from type ‘std::complex<double>’ to type ‘double [2]’ 

我在做什么错?

回答

8

如下重新编写代码:

#include <complex> 
#include <fftw3.h> 
int main() 
{ 
    std::complex<double> x(1,0); 
    fftw_complex fx; 
    memcpy(&fx, &x, sizeof(fftw_complex)); 
} 

每一个编译器,我使用将优化出的memcpy,因为它是复制固定的,即在编译时,数据量。

这可以避免pointer aliasing issues

编辑:您也可避免使用工会如下严格别名问题:

#include <complex> 
#include <fftw3.h> 
int main() 
{ 
    union stdfftw 
    { 
     std::complex<double> stdc; 
     fftw_complex   fftw; 
    }; 
    std::complex<double> x(1,0); 
    stdfftw u; 
    u.stdc = x; 
    fftw_complex fx = u.fftw; 
} 

虽然严格的这种C99规则(不知道C++)被打破从工会的不同成员阅读写的也是未定义的。它适用于大多数编译器。我个人更喜欢我最初的方法。

+0

好吧,这对我很有用!3年不纯C编码:)非常感谢。 – galadog 2010-11-18 12:09:50

+0

@galadog 是否需要memcpy?为什么你不能这样做: 'std :: complex x(1,0); fftw_complex * fx =&x' – 2011-10-22 01:40:52

+0

@Andre Boos:因为这打破了严格的别名规则...... – Goz 2011-10-22 07:36:32

4

reinterpret_cast只适用于指针和引用。所以,你不得不这样做:

#include <complex> 
#include <fftw3.h> 
int main() 
{ 
    std::complex<double> x(1,0); 
    fftw_complex fx(*reinterpret_cast<fftw_complex*>(&x)); 
} 

这假定fftw_complex有一个拷贝构造函数。为避免出现严格别名问题,应优先选择Goz's solution

+1

你在上面做什么打破严格走样规则,应该避免。海湾合作委员会会警告你这样做,如果你有严格的别名打开,将有可能中断。 – Goz 2010-11-18 11:56:10

+0

@Goz:你说得对。我添加了一条警告并提到了你的答案。 – 2010-11-18 12:02:04

+2

作品也可以参考:'fftw_complex fx(reinterpret_cast (x));' – MSalters 2010-11-19 10:04:12

18

fftw_complex和C99和C++复杂类型的位兼容性并不是说它们可以很容易地彼此创建,但是FFTW中指向fftw_complex的所有函数也可以指向C++ std ::复杂。因此,最好的办法可能是使用std ::复杂<>整个程序,只调用FFTW功能转换时,指针为这些值:

std::vector<std::complex<double> > a1, a2; 
.... 
.... 
fftw_plan_dft(N, reinterpret_cast<fftw_complex*>(&a1[0]), 
       reinterpret_cast<fftw_complex*>(&a2[0]), 
       FFTW_FORWARD, FFTW_ESTIMATE); 
.... 
+0

到目前为止最好的方法。 – Mike 2013-06-25 23:46:49