2015-01-06 2 views
-1

В настоящее время я пытаюсь реализовать внешний для 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 я сделал, но ошибка все еще происходит ...

+0

Просьба [не использовать] (http://stackoverflow.com/q/605845/2173917) возвращаемое значение 'malloc()'/'calloc()'. –

+0

Что такое 'TAILLE'? и: оно больше 64? – joop

+0

Я не могу понять, что делает этот код, но я предлагаю вам начать отладку. Вы можете пройти через код, чтобы увидеть, где находится ошибка, или вы можете «уменьшить масштаб» кода и перейти от пустого расширения, постепенно добавляя материал (и постепенно увеличивая использование памяти), пока ошибка не повторится. Тогда вы знаете, где ошибка. –

ответ

2

вы используете class_new() неправильно.

это аргументы:

  • имя
  • конструктор
  • деструкторов
  • размер структуры член-данных
  • флаги
  • Arg-спецификации для конструктора
  • в 0 (терминатор)

Вы поменялись местами size и flags, указав эффективный размер 0 байт. Затем pd_new() выделяет 0 (нулевые, нулевые) байты для вашего fft -струкции, что приводит к повреждению памяти после доступа к членам структуры (как в следующей строке).

кроме этого: пожалуйста, всегда используйте t_sample вместо t_float (или float !!) для значений образца. всегда используют t_float вместо float для номеров сообщений.