IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

[Puredata] Memory corruption


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Par défaut [Puredata] Memory corruption
    Bonsoir !

    Je suis en train de tenter d'implémenter un external puredata en C pour le traitement de signal, et j'ai un problème de memory corruption que je n'arrive pas à résoudre... Tout d'abord, voici le code (les fonctions que vous ne connaissez pas m'ont été fournies dans un couple .c/.h ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    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);
     
    }
    Je compile alors avec le makefile qui m'a également été fourni, et j'obtiens sur le terminal, au moment de l'ouverture du patch puredata utilisant mon external (également fourni) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    *** Error in `puredata': malloc(): memory corruption: 0x084f4570 ***
    Pd: signal 6
    En utilisant des prints, j'ai pu voir que l'erreur survient lors de la création de l'outlet, mais je ne comprends pas pourquoi. Ha, et TAILLE est la taille des bigbuffer, et vaut pour l'instant 1024. Même en enlevant tous le calloc, l'erreur est toujours présente.

    Merci !

  2. #2
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 329
    Par défaut
    Salutations ^^

    Je n'ai pas encore testé ton code, je ne suis pas un expert en transformées de Fourrier et de DSP mais ça m'intéresse ^^

    En ce qui concerne ma propre expérience, tous les soucis de 'memory corruption' sont liés à des free() mal placés ou à des malloc (calloc ou realloc) dont la taille à réserver n'est pas correcte: malloc(sizeof(t_Menu)) au lieu de malloc(sizeof(t_Menu*)) par exemple.

    Je vais tenter de comprendre ce qu'il se passe et je te dirais quoi.

  3. #3
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 329
    Par défaut
    Il me manque évidemment les déclarations des types pour pouvoir effectuer un débug correct... je ne sais pas à quoi correspond un t_int un t_myfft_tilde etc...

    Si tu savais me filer la librairie a lier avec le code source et les fichiers headers ce serait sympa... là comme ça je ne vois pas grand chose dans ton code qui pourrait provoquer un 'memory corruption' mis à part les "méthodes" *_free ou *_new.

  4. #4
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Par défaut
    Salut hurukan ! Déjà merci d'essayer de m'aider

    En ce qui concerne les t_int etc, ce sont des redéfinitions de type de Puredata. Je ne gère absolument pas ça. Je joins donc à mon message l'annexe qui m'a été fournie et le fichier de puredata contenant ces redéfinitions. Et puis le .c complet (contenant aussi les fonctions annexes. A la base c'était dans un couple .c/.h à part, mais le linkage ne fonctionne apparemment pas, donc on m'a dit de tout mettre dans mon fichier pour faciliter les choses), tant qu'à faire.
    Images attachées Images attachées
    Fichiers attachés Fichiers attachés

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Par défaut
    Ha, et aussi le how to dont je me sers pour m'aider : http://pdstatic.iem.at/externals-HOW...html#x7-290005

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Quel est le type de t_int? Si ce n'est pas un alias sur intptr_t, alors ça risque de planter en 64 bits, vu que tu les convertis en pointeur ensuite.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. JNI malloc(): memory corruption
    Par manpe dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 07/12/2009, 12h16
  2. memory corruption error
    Par CHATon dans le forum Débuter
    Réponses: 23
    Dernier message: 21/07/2009, 13h15
  3. [C] Malloc, memory Corruption
    Par publicStaticVoidMain dans le forum C
    Réponses: 2
    Dernier message: 18/05/2009, 01h39
  4. Réponses: 0
    Dernier message: 18/09/2007, 19h07
  5. memory corruption
    Par GLSpirit dans le forum C++
    Réponses: 2
    Dernier message: 23/05/2007, 08h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo