将struct数据保存到void *变量

时间:2012-06-16 15:56:09

标签: c embedded embedded-linux

我正在努力在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));

但它仍然不起作用。

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

谢谢, 安舒

4 个答案:

答案 0 :(得分:2)

我打算在这里猜一猜。你为什么不把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指针只是指向某些数据的通用指针。它是接收任何数据的函数方式,然后可能将其转换为complex_float结构以对数据进行操作。

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

答案 1 :(得分:0)

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

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

应该可以更改为

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

因为malloc的左边只是演员!

答案 2 :(得分:0)

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

void *sigbuf;
complex_float *comSig;
  

complex_float

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

  

sigbuf

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

  

comSig

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

DSP基础设施需要

中的调制输出
  

sigbuf

已经计算并保存在

  

comSig

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

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

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

答案 3 :(得分:0)

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