【问题标题】:Confusion about length of void*关于空隙长度的困惑*
【发布时间】:2014-01-03 08:54:10
【问题描述】:

我有一个关于 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);

我怎样才能做到这一点?

【问题讨论】:

  • 你测试了吗?它奏效了吗?它是某种图书馆吗?如果是这样,那么文档是怎么说的?我怀疑来自麦克风的数据会是双倍的。
  • 我认为我真正的问题是如何处理 void* 数据中的信息?可以很好地转换为双精度数据或其他类型的数据吗?
  • 文档应该告诉你数据的格式。
  • 如果您的音频采用double 格式,我会感到惊讶。这给你一个疯狂的范围(几个一百 dB),远远超过你的硬件可以处理的范围。通常,short 就足够了。

标签: c++ signal-processing


【解决方案1】:

指针是内存中的地址。这是数据的第一个字节的地址。指针的类型告诉你数据有多长。所以如果我们有

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_t (uint8_t 保证有 1 个字节)。

或者是这样的:

double * aux = (double*) data;

你有一个lenbutes/sizeof(double) 元素的向量,类型为double。但是你需要小心,让lenbytessizeof(double) 的倍数。

编辑

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

【讨论】:

  • 非常感谢您的帮助,现在我明白了;)
猜你喜欢
  • 2019-05-17
  • 2020-03-06
  • 2016-03-16
  • 2013-07-27
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多