2012-08-06 53 views
2

我有一些C99代碼,我需要將2n double數組轉換爲n複合數組。我這樣做與C99複雜鑄造

static void real_to_complex(const double *r, size_t n, double complex *z) 
{ 
    size_t i; 

    for (i=0 ; i<n ; i++) 
    z[i] = r[2*i] + r[2*i + 1]*I; 
} 

這是代碼的性能非常重要的一部分,我真的寧可不要創建一個新的存儲區域Z和具有複製的費用,而不是我想取代這些函數調用

z = (double complex*)r; 

有沒有辦法做到這一點,並保持標準符合?我知道一個雙重複合體保證與兩個雙精度數組具有相同的佈局 - 也許我可以通過編譯器檢查來了解這個佈局是(真實的,想象的)還是(虛構的,真實的)?

回答

3

確保complex陣列的第一個元素對應於實部,第二個元素對應於虛部。

報價從the publicly available draft of C11 Standard

6.2.5/13每個複雜類型具有相同的表示和對齊要求作爲含有相應真實類型的恰好兩個元件的陣列型;第一個元素等於複數 數字的實部,第二個元素到虛部。

實施例程序

#include <complex.h> 
#include <stdio.h> 

int main(void) { 
    double x[] = {42, 2, 41, 1, 0, 0}; 
    _Complex double *y = (void*)x; 
    while (creal(*y) > 0) { 
    printf("%f + %fi\n", creal(*y), cimag(*y)); 
    y++; 
    } 
    return 0; 
} 
+0

這;只需使用'(double complex *)r'即可。 – 2012-08-06 18:57:29

+0

謝謝你,這給了我的代碼一個巨大的速度碰撞:-) – n00b 2012-08-06 20:16:31