繁体   English   中英

将struct数据保存到void *变量

[英]Saving struct data to a void* variable

我正在研究在DSP处理器上实现BFSK算法,并且需要使用预定义的DSP infra文件模拟LINUX上的实现。 输入数据以float数组的形式出现。 逐个从输入中提取各个比特。 调制输出在typdef结构的fprm中生成,该结构由两个浮点变量组成(实数和虚数部分,因为调制数据是复数基带信号)。 但DSP仿真需要将输出保存到void指针数组中。 由于DSP API需要以void指针的形式进行更改,因此无法更改。 结构的定义如下:

typedef struct {
float re;
float im;
}complex_float;

我可以使用memcpy将数据复制到void指针中:

sigbuf=(float *)malloc(bitsPerBlk*sigLen*sizeof(complex_float));

memcpy(sigbuf, comSig, (bitsPerBlk*sigLen*sizeof(complex_float)));

sigbuf是void指针数组,其中输出将被保存,comSig是complex_float数组,其中保存了调制输出。 问题是我无法访问sigbuf数组的invidual值。 我也尝试过这个

sigbuf=(complex_float *)malloc(bitsPerBlk*sigLen*sizeof(complex_float));

但它仍然无效。

如果有人可以帮助我,那对我来说会很有帮助。

谢谢,安舒

我要在这里猜一猜。 你为什么不把comSig的副本复制到sigBuf然后传递给你的API?

complex_float *sigBuf = malloc(TOTAL_SIZE_OF_COMSIG);
memcpy(sigBuf, comSig, TOTAL_SIZE_OF_COMSIG);

我不知道你的函数上的文档,但听起来你的API需要一个指向一些数据缓冲区的void指针,也许它的长度或元素数量。

dsp_api(sigBuf, sigBufSize);

我认为你误解了void指针是什么以及你的函数想要什么。 void指针只是指向某些数据的通用指针。 它是接收任何数据的函数方式,然后可能将其转换为complex_float结构以对数据进行操作。

作为将来无法取消引用void指针的原因的未来参考是因为它没有大小。 你必须将它转换为一种类型,然后你就可以取消引用它。

如果sigbuf是类型(void *)那么你的行

sigbuf=(complex_float *)malloc(bitsPerBlk*sigLen*sizeof(complex_float));

应该可以改为

sigbuf=(void *)malloc(bitsPerBlk*sigLen*sizeof(complex_float));

因为malloc的左边只是一个演员!

对不起,我很难说我无法清楚地解释我的观点。 声明如下

void *sigbuf;
complex_float *comSig;

complex_float

是一个由两个浮点元素组成的结构。

sigbuf

将存储调制数据,然后进一步传递给传输系统。

comSig

是一个complex_float数组(基本上是一个sin和余弦函数输出数组)。

DSP基础设施需要调制输出

sigbuf

已经计算并保存在

comSig

somSig和sigbuf都是在DSP基础设施中预定义的。

我的问题是我能够将整个comSig aaray复制到sigbuf数组,但是无法访问sigbuf数组的各个元素。

我通过全局指针变量传递comSig数组本身的地址来解决问题的任何方法.DSP基础设施提供了这样做的自由。 所以,目前问题似乎已得到解决。 安士,再次感谢。

确保目标地址sigbuf正确对齐。 例如,DSP可能要求4字节浮点值必须在4字节边界上对齐。 memcpy()可能不会检查对齐,并会复制单个字节而不会抱怨。 但是如果sigbuf没有正确的对齐,那么你将无法以float形式访问内容(即,当数据从内存读入寄存器时,数据将被破坏)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM