4

2ndoubleの配列をndoublecomplexの配列に変換する必要がある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;

これを行い、標準に準拠し続ける方法はありますか?ダブルコンプレックスは、2つのダブルの配列と同じレイアウトであることが保証されていることを理解しています-おそらく、このレイアウトが(実数、虚数)か(虚数、実数)かについてのコンパイラチェックで逃げることができますか?

4

1 に答える 1

3

complex配列の最初の要素が実数部に対応し、2番目の要素が虚数部に対応することが保証されます。

C11標準の公開されているドラフトからの引用

6.2.5 / 13各複合型には、対応する実数型の2つの要素を正確に含む配列型と同じ表現および配置要件があります。複素数の最初の要素は実数部に等しく、2番目の要素は虚数部に等しくなります。

サンプルプログラム

#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;
}
于 2012-08-06T17:37:55.063 に答える