问题铸造STL复杂<双>到fftw_complex
-
26-09-2019 - |
题
在FFTW手册说其fftw_complex
类型是位兼容std::complex<double>
在STL类。但是,这并不为我工作:
#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]’
我在做什么错了?
解决方案
如下重新编写代码:
#include <complex>
#include <fftw3.h>
int main()
{
std::complex<double> x(1,0);
fftw_complex fx;
memcpy( &fx, &x, sizeof( fftw_complex ) );
}
我使用每个编译器将优化出的memcpy,因为它是复制固定的,即在编译时,数据量。
这避免了指针混叠问题。
编辑:您也可以尽量避免使用工会严格走样的问题如下:
#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 ++)被分解为从联合到一个写入太的不同成员读取未定义。它适用于大多数编译器虽然。我个人更我的原始方法。
其他提示
后面的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);
....
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
具有拷贝构造。为了避免严格别名问题,戈兹贝达的解决方案应该是优选的。
不隶属于 StackOverflow