对空洞长度的困惑*

时间:2014-01-03 08:54:10

标签: c++ signal-processing

我对void *有疑问。我有一个功能,通过麦克风捕获0.2秒的音频块。我必须以复杂的方式处理这些块。此函数将这些音频块作为void *返回。要处理这些信息我不能使用void *因为我无法访问它们,所以我必须转换其他类型的数据,例如double但我不知道这个新指针的长度是多少,或者怎么能我做。我通过互联网搜索,但我对如何做有疑问。

我的代码:

void Pre_proc_mono::PreProcess(void *data, int lenbytes, float t_max){

double * aux = (double*) data;


}

现在,aux的长度也是lenbytes?或者我必须做类似的事情:

int size = lenbytes/sizeof(double);

一些帮助?

感谢

1 个答案:

答案 0 :(得分:3)

指针是内存中的地址。这是数据的第一个字节的地址。指针的类型告诉您数据的持续时间。所以,如果我们有

int *p

p的值告诉您数据的开始位置,以及指针的类型,在这种情况下int *告诉您,从该地址开始,您需要占用4个字节(在大多数架构上)。

void *指针只有起始地址,但不包含数据的长度,这就是为什么你不能取消引用void *指针的原因。

sizeof(p)其中p是指针(任何类型)是指针的大小,与指针所指向的数据类型无关

例如:

sizeof(char) == 1
sizeof(char *) == 4
sizeof(void *) == 4

在你的功能中:

void *data, int lenbytes, float t_max

data是指向数据开始位置的指针,lenbytes是数据的字节数。

所以你可以拥有类似的东西:

uint8_t *aux =  (uint8_t*) data;

你有lenbytes uint8_tdouble * aux = (double*) data; 元素的向量(uint8_t保证有1个字节)。

或类似的东西:

lenbutes/sizeof(double)

你有一个double lenbytes元素的向量。但是您需要小心,以便sizeof(double)是{{1}}的倍数。

修改

关于你应该转换成什么,答案仅取决于你的数据块的格式。阅读文档,或搜索示例。