【问题标题】:Copy void* content into SigLib struct SLData_t*将 void* 内容复制到 SigLib 结构 SLData_t*
【发布时间】:2013-12-30 11:15:43
【问题描述】:

我正在使用 C++ 做一个 Windows 应用程序。我有下一个家伙。

我有这个功能,我收到带有数据音频捕获的void *

void Pre_proc_mono::PreProcess(void *data, int lenbytes) {
    SLData_t *signal1;
    SLData_t *signal2;
    SLData_t *result;
    signal1 = (SLData_t*)data;
    signal2 = new SLData_t[lenbytes];
    result = new SLData_t[2 * lenbytes - 1];

    for (int i = 0; i < lenbytes; i++){
        signal2[i] = signal1[i];
    }
}

循环总是在 11000 左右失败,为什么?我究竟做错了什么 ?然后的想法是与 SigLib 库(DSP 库)进行相关交叉。所以我需要有限制的数组,而不是指针,所以我这样做了。帮忙?

编辑: 首先,当我说失败时,我想说当循环达到大约 11000 时出现运行时错误。 第二个SLData_t 是SigLib 库的一种日期,做相关交叉的函数需要这个变量作为输入。

【问题讨论】:

  • 您需要提供有关“失败”、“11000”和 lenbytes 值的更多信息。
  • 什么是SLData_t,为什么你将lenbytes(建议“以字节为单位的长度”)视为项目的长度。
  • 由于数组索引 i 超出 (void*) 数据的范围,可能会发生故障。在使用它之前还要检查它是否为空(尽管在这种情况下它应该在第一次访问时失败,而不是 11000)。
  • 等一下,如果我正确地用 Google 搜索(浮动或双精度)和 int lenbytes,你有 SLData_t 这可能是 4-8 个字节。

标签: c++ windows signal-processing


【解决方案1】:

以下可能会有所帮助:

void Pre_proc_mono::PreProcess(void *data, int lenbytes) {
    SLData_t* signal1 = reinterpret_cast<SLData_t*>(data);
    const std::size_t signalCount = lenbytes / sizeof (SLData_t);
    // then if you want to copy inside a std::vector
    std::vector<SLData_t> signal2(signal1, signal1 + signalCount);
}

【讨论】:

  • 使用std::size_t 而不是int。这个“将某些东西复制到其他位置” 函数是有符号整数安全漏洞的经典示例。
  • @TeloPenaBarreiro:您必须先#include &lt;vector&gt; 才能使用std::vector
【解决方案2】:

使用std::vector 代替手动内存管理和std::copy() 可以更好、更安全、更简单地实现:

void Pre_proc_mono::PreProcess(void *data, std::size_t lenbytes){

    SLData_t *signal1 = (SLData_t*)data;
    std::size_t data_length = lenbytes / sizeof( SLData_t );
    std::vector<SLData_t> signal2;
    std::vector<SLData_t> result;

    std::copy( std::begin( signal1 ) , 
               std::end( signal1 ) + data_length , 
               std::back_inserter( signal2 ) 
             );
}

【讨论】:

  • “硬”部分是signal1的结尾。
  • @Jarod42 好的,你可以使用length = lengthbytes / sizeof( SLData_t ); ?
  • @Jarod42 不是必要的,只是偏执狂:)
  • 音频人士非常喜欢他们的数据块。并且不要忘记结果将被期望原始数组而不是向量的代码使用。
  • @UmNyobe:没问题。 vector 包装了一个原始数组。音频代码不会进行内存管理,它只需要一个指向 data[0] 的指针。
猜你喜欢
  • 2020-10-22
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 2017-03-23
  • 1970-01-01
  • 2015-01-06
相关资源
最近更新 更多