Строка в красном - это ваш стек вызовов: в основном, это говорит о том, что проблема возникла внутри функции sepChannels_8()
, которая была вызвана от main()
. На самом деле у вас есть несколько ошибок в вашей функции sepChannels_8()
.
Вот мой анализ:
struct LandR sepChannels_8(unsigned char *smp, unsigned long N, unsigned char *L, unsigned char *R, struct LandR LRChannels)
sepChannels_8
это функция, которая принимает пять аргументов различных типов и возвращает значение типа struct LandR
. Однако неясно, какие пять аргументов переданы этой функции. unsigned char *smp
, по-видимому, является указателем на ваши звуковые образцы, а unsigned long N
- это общее количество образцов. Но unsigned char *L
, unsigned char *R
и struct LandR LRChannels
, это совсем не ясно, в чем дело. Вы не использовать их. unsigned char *L
и unsigned char *R
, ваша функция быстро отбрасывает любые переданные указатели, заменяя их памятью, выделенной с использованием malloc()
, которая затем выбрасывается без free()
d, и единственное, что вы делаете с struct LandR LRChannels
, просто возвращает ее без изменений.
{
int i;
if (N % 2 == 0) // Each channel's (L,R) number of samles is 1/2 of all samples.
{
L = malloc(N/2);
R = malloc(N/2);
}
else
if (N % 2 == 1)
{
L = malloc(N + 1/2);
R = malloc(N + 1/2);
}
Теперь это интересно: Если прошло в unsigned long
, N
, четное число, можно использовать malloc()
выделить два блока хранения, каждый N/2
в размерах, и назначать их L
и R
. Если N
не существует, вы затем дважды проверяете, является ли это нечетным числом, и если это так, вы используете malloc()
для выделения двух блоков хранения, каждый из которых составляет N
, и назначьте их L
и R
. Я думаю, что вы, возможно, намеревались выделить два блока хранения, каждый из которых имел размер (N + 1)/2
, но умножение и деление происходят до сложения и вычитания, так что это не то, что вы получаете. Вы также не учитываете, что произойдет, если N
не является ни даже нечетным. Это нормально, потому что в конце концов это невыполнимое условие ... так почему вы проверяете возможность?
int m = 0;
for (i = 0; i < N; i++) // separating
{
L[m] = smp[2 * i + 0]; // THIS IS THE "LINE: 105"
R[m] = smp[2 * i + 1];
m++;
}
В основном довольно стандартный: у вас есть цикл, со счетчиком, и массивы, чтобы пройти. Тем не менее, ваше условие завершения неверно. Вы перемещаетесь по своим smp
данным за два шага за раз, и делаете это, умножая индекс массива, поэтому ваш индексный счетчик должен работать от 0
до N/2
, а не от 0
до N
. (Кроме того, вам нужно учесть этот последний элемент, если N
был нечетным ...). Кроме того, вы используете m
и i
за то же самое в одно и то же время. Один из них не нужен, и лишний, и не нужен, и дополнительный.
return LRChannels;
}
И вернуть LRChannels
-структуру, которая была передана в функцию, в неизменном виде. В то же время вы отбрасываете переменные L
и R
, которые содержат указатели на malloc()
-распределенное хранилище, которое теперь потеряно.
Что было L
и R
Предполагалось быть? Похоже, что они должны быть unsigned char **
, чтобы вы могли вернуть выделенное хранилище обратно вызывающему, сохранив указатели через них ... или, возможно, struct LandR
имеет два элемента, которые являются указателями, и вы намеревались сэкономить L
и R
в структуре, прежде чем возвращать его? для L
и R
и LRChannels
, я не понимаю, почему вы передаете их функции. Вы можете также сделать все автоматические переменные внутри функции так же, как int i
и int m
.