Я использую приложение 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, а функция выполнения корреляционной перекрестки нуждается в этой переменной в качестве входных данных.
Следующее может помочь:
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
. Эта функция «скопировать что-либо в другое место» является классическим примером целочисленной дыры в безопасности.
#include <vector>
прежде чем сможете использовать std::vector
.
Это может быть реализовано гораздо лучше, безопасно и просто, используя 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
.
length = lengthbytes / sizeof( SLData_t );
?
SLData_t
и почему вы рассматриваетеlenbytes
(который предлагает "длину в байтах") как длину в элементах.