В настоящее время я пытаюсь реализовать внешний для Pure Data с помощью C. Я не использовал C некоторое время, и у меня проблема с повреждением памяти. Я не знаю, что делать, поэтому я прошу вас о помощи.Повреждение памяти при реализации Pure Data external с помощью C
Вот код. Помните, что это C-код для Pure Data.
t_int *myfft_tilde_perform(t_int *w) {
t_myfft_tilde *fft = (t_myfft_tilde *)w[1];
t_float *in = (t_float *)w[2];
t_float *out = (t_float *)w[3];
int n = (int)w[4];
int i;
for(i=0; i<n; i++)
{
fft->bigbuffer[fft->nextindex] = in[i];
fft->nextindex = (fft->nextindex+1)%TAILLE;
}
if (!fft->isfull && fft->nextindex==0)
{
fft->isfull=1;
}
if (fft->isfull)
{
for(i=0; i<TAILLE; i++)
{
fft->bigbuffercpy[i] = fft->window[i] * fft->bigbuffer[i];
}
rdft(TAILLE, 1, fft->bigbuffercpy, fft->bitshuffle, fft->weighting);
if (fft->nextindex==0)
{
i=(TAILLE-1)-64;
}
else
{
i=fft->nextindex-64;
}
int j;
for(j=0; j<64; j++)
{
out[j] = fft->bigbuffercpy[i+j];
}
}
return (w+5);
}
void myfft_tilde_dsp(t_myfft_tilde *x, t_signal **sp) {
dsp_add(myfft_tilde_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
}
void myfft_tilde_free(t_myfft_tilde *x) {
if (x->bitshuffle)
freebytes(x->bitshuffle, TAILLE*2*sizeof(int));
if (x->weighting)
freebytes(x->weighting, TAILLE*2*sizeof(float));
if (x->window)
freebytes(x->window, TAILLE*sizeof(float));
if (x->bigbuffer)
freebytes(x->bigbuffer, TAILLE*sizeof(float));
if (x->bigbuffercpy)
freebytes(x->bigbuffercpy, TAILLE*sizeof(float));
}
void *myfft_tilde_new(void) {
t_myfft_tilde *fft = (t_myfft_tilde *)pd_new(myfft_tilde_class);
fft->x_out = outlet_new(&fft->x_obj, &s_signal);
fft->bitshuffle = (int *)calloc(TAILLE*2, sizeof(int));
fft->weighting = (float *)calloc(TAILLE*2, sizeof(float));
fft->window = (float *)calloc(TAILLE, sizeof(float));
fft->bigbuffer = (float *)calloc(TAILLE, sizeof(float));
fft->bigbuffercpy = (float *)calloc(TAILLE, sizeof(float));
int i;
for(i=0; i<TAILLE; i++)
{
fft->window[i] = 0.54 - 0.46*cos(TWOPI*i/TAILLE);
}
fft->nextindex=0;
fft->isfull=0;
init_rdft(TAILLE*2, fft->bitshuffle, fft->weighting);
return (void *)fft;
}
void myfft_tilde_setup(void) {
myfft_tilde_class = class_new(gensym("myfft~"),
(t_newmethod)myfft_tilde_new,
(t_method)myfft_tilde_free,
0, sizeof(t_myfft_tilde),
CLASS_DEFAULT, A_GIMME, 0);
CLASS_MAINSIGNALIN(myfft_tilde_class, t_myfft_tilde, f);
class_addmethod(myfft_tilde_class, (t_method)myfft_tilde_dsp,
gensym("dsp"), 0);
}
Функции, которые вы не знаете, являются функциями, которые мне были предоставлены. Ошибка повреждения памяти возникает следующим образом: я скомпилирую код с помощью данного файла makefile, затем я пытаюсь запустить данный файл Pure Data с помощью полученного файла pd_linux на консоли, и я немедленно получаю это сообщение в консоли:
Я пытался даже удалить все calloc я сделал, но ошибка все еще происходит ...
Просьба [не использовать] (http://stackoverflow.com/q/605845/2173917) возвращаемое значение 'malloc()'/'calloc()'. –
Что такое 'TAILLE'? и: оно больше 64? – joop
Я не могу понять, что делает этот код, но я предлагаю вам начать отладку. Вы можете пройти через код, чтобы увидеть, где находится ошибка, или вы можете «уменьшить масштаб» кода и перейти от пустого расширения, постепенно добавляя материал (и постепенно увеличивая использование памяти), пока ошибка не повторится. Тогда вы знаете, где ошибка. –