У меня есть следующий 2D-массив:
float accumulator[MAX_CHANNELS][2*MAX_FRAME_LENGTH];
и я продолжаю перемещать блоки памяти в своем коде для каждого канала следующим образом:
for (int channel = 0; channel < nChannels; channel++) {
memmove(accumulator[channel], accumulator[channel] + stepSize, fftFrameSize * 2 * sizeof(float));
}
Однако это дает мне неверные результаты, и я не понимаю, почему. Что не так с memmove
позвоните, что я использую?
В качестве альтернативы я попытался использовать следующие одномерные массивы (по 1 для каждого канала) и получил правильные результаты:
float accumulator1[2*MAX_FRAME_LENGTH];
float accumulator2[2*MAX_FRAME_LENGTH];
memmove(accumulator1, accumulator1 + stepSize, fftFrameSize * 2 * sizeof(float));
memmove(accumulator2, accumulator2 + stepSize, fftFrameSize * 2 * sizeof(float));
Я не занимался никаким кодированием в течение нескольких лет, но мне кажется, что, возможно, вы написали код, которому трудно следовать логически.
Мое единственное предложение состоит в том, чтобы найти ручку и бумагу, чтобы нарисовать линию горизонтально через середину листа, чтобы у вас было два раздела, представляющих каждый блок памяти, который вы хотите переместить. Сделайте нижнюю половину бумаги для представления ИСТОЧНИКА, а верхнюю — для НАЗНАЧЕНИЯ. Напишите буквы A, B и C в верхней половине вертикально вниз. Затем напишите числа 1, 2 и 3 вертикально вниз по стороне нижней половины.
Затем на отдельном листе бумаги запишите имя счетчика «канал», запустите его со значения ноль.
Теперь вычеркните букву А из пункта назначения и поместите в нее цифру 1 = число 1 идет от источника к месту назначения, перезаписывая А в пункте назначения. Теперь увеличьте счетчик «канал» на 1 на отдельном листе бумаги. Повторите еще 2 раза всю эту операцию. Теперь посмотрим, что находится в месте назначения и что осталось в источнике, а также значение счетчика «канал», это покажет вам, что происходит внутри памяти вашего компьютера и счетчик «канал». Лично я был бы склонен переписать код так, чтобы второй параметр memmove не был также назван channel. Внутри квадратных скобок. Надеюсь это поможет. Вот объясненная функция http://www.cplusplus.com/reference/cstring/memmove/.
Не забывайте, что функция memmove будет работать до тех пор, пока канал < nchannels. Вы должны записать значения во все переменные во время цикла, стандартная практика для отладки.
Других решений пока нет …