سؤال

دليل 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 :: Complex. لذلك ، ربما يكون أفضل طريقة هو استخدام STD :: Complex <> خلال البرنامج وتحويل المؤشرات فقط إلى هذه القيم عند استدعاء وظائف 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