【问题标题】:Passing a C++ complex array to C将 C++ 复杂数组传递给 C
【发布时间】:2011-02-16 17:47:10
【问题描述】:

我必须将复杂数据从 C++ 传递给 C 函数。在 C++ 中,数据自然存储在 std::vector<std::complex> c。 C 函数期望数据为双精度数组 double a[] 使得 a[0]=Re(c[0]), a[1]=Im(c[0]), a[2]=Re( c[1]) 等。

传递此类数据的最佳安全方式是什么?正在投射像

(double*) (&c[0])

找麻烦?

对不起,如果这是重复的,我只能找到有关将 C++ complex 传递给 C99 complex 的相关问题的信息。

【问题讨论】:

    标签: c++ c


    【解决方案1】:

    C++0x 标准竭尽全力保证此类转换能够正常工作(第 26.4 节):

    此外,如果 a 是 cv std::complex<T>* 类型的表达式,并且表达式 a[i] 对于整数表达式 i 是明确定义的,那么:

    ——reinterpret_cast<cv T*>(a)[2*i] 应指定a[i] 的实部,并且

    ——reinterpret_cast<cv T*>(a)[2*i + 1] 应指定a[i] 的虚部。

    和(§23.3.6):

    向量的元素是连续存储的,这意味着如果vvector<T, Allocator>,其中T 是bool 以外的某种类型,那么它对所有0 <= n < v.size() 都遵循标识&v[n] == &v[0] + n

    复杂值的布局由流行的 C++03 标准保证(尽管矢量布局是),但我会惊讶地发现它不适用的实现.

    【讨论】:

    • C++0x 标准是否已经到位?如果不是,则此保证不一定适用于 OP(标签为 C/C++)
    • @Samaursa:我在回答的最后一段中提到了这一点。
    • 感谢您的回答。我正在使用默认情况下不符合 C++0x 的 GNU C(至少是我正在运行的版本),但我可能会得到你解释的行为(这对我来说非常方便)明确请求 C++ 0x。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 2017-02-07
    • 2020-12-26
    • 2013-02-26
    • 1970-01-01
    • 2013-05-25
    • 2013-02-03
    相关资源
    最近更新 更多