C语言中complex.h的踩坑记录

C语言中complex.h的踩坑记录一段C语言,在matlab用MEX编译时出错,报错:C2143:语法错误:缺少“;”(在“*”的前面)C2059:语法错误typedefstruct{size_tsz;size_tnele;floatcomplex*arr;}VarCFloatComplexArray;解决:提问后https://ask.csdn.net/questions/7410767,根据提示,看complex.h文件把问题中的floatcomplex改为_C_float_comp

一个在github上下的C语言程序,在matlab用MEX编译时出错,

报错:C2143: 语法错误: 缺 少“;”(在“*”的前面) C2059: 语法错误

typedef struct
{ 
   
  size_t sz;
  size_t nele;
  float complex *arr;
} VarCFloatComplexArray;

解决:提问后https://ask.csdn.net/questions/7410767,根据提示,看complex.h文件把问题中的float complex改为_C_float_complex
在这里插入图片描述

报错:error C2440: “函数”: 无法从“_C_float_complex”转换为“_Dcomplex”

_C_float_complex p;

 /* Get a point. This fails only if there are no more points */
    if (popRandomQueue(&proclist, &p, &ran_seed) == FAILURE) break;
    pW = creal(p);
    pH = cimag(p);

查看complex.h,首先 _Dcomplex就是 _C_double_complex
而double和float的运算符有点区别:

_ACRTIMP double    __cdecl creal(_In_ _Dcomplex _Z);
_ACRTIMP float     __cdecl crealf(_In_ _Fcomplex _Z);

解决:把creal改为crealf,cimag改为cimagf

报错:error C2088: “*”: 对于struct 非法

r_grid[idx] = rgridR + rgridI*I;

其中r_grid是_C_double_complex,rgridR和rgridI分别表示实部和虚部的值,都为float类型。I在complex.h中定义如下:

#define _DCOMPLEX_(re, im) _Cbuild(re, im)
#define _FCOMPLEX_(re, im) _FCbuild(re, im)
#define _LCOMPLEX_(re, im) _LCbuild(re, im)

#define _Complex_I _FCbuild(0.0F, 1.0F)
#define I _Complex_I

解决方式参照:https://stackoverflow.com/questions/62156379/complex-and-double-complex-methods-not-working-in-visual-studio-c-project?r=SearchResults
一个目前没报错但不知是否符合意义的解决方式:
根据_C_double_complex声明:

    typedef struct _C_float_complex
    { 
   
        float _Val[2];
    } _C_float_complex;

把代码改为:

	//r_grid[idx] = rgridR + rgridI*I;
    r_grid[idx]._Val[0]= rgridR;
    r_grid[idx]._Val[1]= rgridI;

今天的文章C语言中complex.h的踩坑记录分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/26567.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注