質問

FFTWマニュアルは、そのfftw_complexタイプはビットであることをを言いますSTLでクラスをstd::complex<double>する互換性。しかし、それは私のために動作しません。

#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_complexへのポインタを取るFFTWのすべての機能も++のstd Cへのポインタを取ることができること::複雑な。したがって、最善のアプローチは、あなたのプログラム全体で<> ::利用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は、コピーコンストラクタを持っていることを前提としています。厳格なエイリアシングの問題を避けるために、ゴズのソリューションにはすべき好ましくあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top