3

std::complex<double>タイプを使用するコードがあります。FFTWマニュアルより

変数がある場合は、complex<double> *x経由で FFTW に直接渡すことができますreinterpret_cast<fftw_complex*>(x)

ただし、コードでこれを行うと:

tmp_spectrum = reinterpret_cast<std::complex<double>*>(fftw_alloc_complex(conf.spectrumSize()));
plan_bw_temp = fftw_plan_dft_c2r_1d(conf.FFTSize(), reinterpret_cast<fftw_complex*>(tmp_spectrum), tmp_out, FFTW_ESTIMATE);

私は得るdereferencing type-punned pointer might break strict-aliasing rules [-Wstrict-aliasing]。この警告を解決するには?ありがとう !

4

1 に答える 1

0

ここには 3 つのオプションがあります。

  • fftw_complex必要なときに作成するだけです。fftw_plan_dft_c2r_1d(conf.FFTSize(), fftw_complex(tmp_spectrum.real(), tmp_spectrum.imag()), tmp_out, FFTW_ESTIMATE);
  • コードでは C++ 言語の複合型を使用せず、fftw_complex型のみを使用してください。
  • を使用して、適切な翻訳単位ですべての厳密なエイリアスの最適化と強制を無効にし-fno-strict-aliasingます。警告だけを黙らせることは、コードが壊れる可能性があるため安全ではありません。
于 2013-08-23T17:54:36.487 に答える