2010-11-18 32 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