C99复合铸造

时间:2012-08-06 11:20:32

标签: c c99 complex-numbers

我有一些C99代码,我需要将2n double的数组转换为n double complex数组。我这样做

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;

有没有办法做到这一点并保持标准符合?我知道双复合体保证具有与两个双精度数组相同的布局 - 也许我可以通过编译器检查这个布局是(真实的,虚构的)还是(虚构的,真实的)?

1 个答案:

答案 0 :(得分: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;
}