簡體   English   中英

C99復合鑄造

[英]C99 complex casting

我有一些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;

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

保證complex數組的第一個元素對應於實部,第二個元素對應於虛部。

引用公開的C11標准草案

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM