Скопируйте содержимое void * в структуру SigLib SLData_t *

0

Я использую приложение Windows с помощью C++. У меня есть следующий чувак.

У меня есть эта функция, где я получаю 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). Поэтому мне нужны массивы с ограничением, а не указатели, поэтому я делаю это вместо этого. Помогите?

EDIT: Во-первых, когда я сказал не удалось, я хочу сказать, что когда цикл достигает примерно 11000, появляется и ошибка времени выполнения. Второй SLData_t является своеобразной датой библиотеки SigLib, а функция выполнения корреляционной перекрестки нуждается в этой переменной в качестве входных данных.

  • 2
    Вам необходимо предоставить больше информации о «сбое», «11000» и значении в байтах.
  • 2
    А что такое SLData_t и почему вы рассматриваете lenbytes (который предлагает "длину в байтах") как длину в элементах.
Показать ещё 3 комментария
Теги:
signal-processing

2 ответа

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);
}
  • 0
    Используйте std::size_t вместо int . Эта функция «скопировать что-либо в другое место» является классическим примером целочисленной дыры в безопасности.
  • 0
    @TeloPenaBarreiro: Вы должны #include <vector> прежде чем сможете использовать std::vector .
0

Это может быть реализовано гораздо лучше, безопасно и просто, используя 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 ) 
             );
}
  • 1
    «жесткая» часть - это конец signal1 .
  • 0
    @ Jarod42 хорошо, вы можете использовать length = lengthbytes / sizeof( SLData_t ); ?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню