【问题标题】:How do I get gcc to connect type Rcomplex with type double complex?如何让 gcc 将 Rcomplex 类型与 double complex 类型连接起来?
【发布时间】:2021-10-15 09:05:50
【问题描述】:

我(希望)破解了 R 包 MASS,使其能够对复数数据执行稳健的线性拟合。它使用外部 c 和 FORTRAN 代码来执行一些我已经修改/替换以适应复数的线性代数。

在尝试通过R CMD SHLIB 编译 c 源文件时,我收到如下错误:

error: invalid operands to binary - (have ‘Rcomplex’ {aka ‘struct <anonymous>’} and ‘Rcomplex’ {aka ‘struct <anonymous>’})

显然,编译器不理解 Rcomplex 类型应被视为双复数类型。这并不完全出乎意料,因为Writing R Extensions 提到这可能发生在具有某些配置的某些编译器上。但是,我找不到任何有关如何更改配置以使其正常工作的信息。

我尝试过更改优化级别无济于事,包括complex.h、Complex.h、Rmath.h和R.h之外的各种头文件也不起作用。

有人知道我可能会错过什么吗?

【问题讨论】:

  • 哪些表达式会产生 such errors
  • 感谢您的评论!对于每个数学运算,我都会遇到这样的错误。就像编译器不知道如何用 Rcomplex 做数学一样。

标签: r c gcc compilation complex-numbers


【解决方案1】:

如果您想根据语句 在大多数平台上以与 C99 双复数类型兼容的方式存储,您可以尝试一下。 g.

#define Ccomplex(Rcomplex) (*(double complex *)&Rcomplex)

并将其应用于每个Rcomplex 操作数,或者您甚至可以尝试将Rcomplex 的定义更改为

typedef double complex Rcomplex;

整个 C 源文件。但请记住,即使它适用于一种机器类型,您也不能确定它适用于其他机器类型。

【讨论】:

  • 感谢您的回答!从那以后,我发现在 c 代码中将 Rcomplex 变量视为双复数实际上并不是标准做法。相反,Rcomplex.h 中有一个函数toC99(const Rcomplex *x),它位于 R 源代码中,用于将 Rcomplex 显式转换为双复数。
猜你喜欢
  • 2020-10-11
  • 2016-04-16
  • 1970-01-01
  • 2011-10-04
  • 2018-06-08
  • 1970-01-01
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多