2012-08-06 55 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