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 :

HELP debogage : access violation ou débordement de pile


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 19
    Points : 10
    Points
    10
    Par défaut HELP debogage : access violation ou débordement de pile
    Bonjour, j'ai un prob sur un truc tout con mais après avoir essayé u ntas de modif je ne l'ai pas résolu.
    Donc j'ai un tableau dynamique dont chaque élément contient 2 arbre syntaxique etje veux désallouer tout ça. mais lorsque j'ai + de 10 éléments (donc 20arbres) j'ai un débordement de pile ou un access violation (le plus souvent). si vous pouvez me dépanner (ou au moins me dire si ça vient des fonctions de desallocations suivantes), merci d'avance.

    j'appelle : ViderEnsembleCourbes(&ECourbe); en quittant mon prog.

    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
    void LibererArbre (TArbreSynt a) //Récursive
    {//Libère la mémoire allouée à l'arbre a
    if (a!= NULL)
            {LibererArbre(a->fg);
             LibererArbre(a->fd);
             free(a);
            }
    }
     
    void ViderEnsembleCourbes(TEnsembleCourbes *PtEC)
    {//Libère la mémoire dynamique associée à l'ensemble de courbes
    //puis initialise le nombre de courbes de l'ensemble à 0
    for (int i=0;i<((*PtEC).nbcourbes);i++)
            {LibererArbre(((*PtEC).TabDynC[i]).ArbreFonction);
             LibererArbre(((*PtEC).TabDynC[i]).ArbreFonction);
            }
    free((*PtEC).TabDynC);
    (*PtEC).nbcourbes=0;
    }
    détails de mes structures au cas où :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    typedef struct NoeudSynt{TNature Nature;
                             double ValConst;
                             char OperOuFct;
                             struct NoeudSynt *fg,*fd;
                            }TNoeudSynt, *TArbreSynt;
     
    typedef struct {TArbreSynt ArbreFonction;
                    TArbreSynt ArbreDerivee;
                    int numero;
                   }TCourbe;
     
    typedef struct {TCourbe *TabDynC;
                    int nbcourbes;}TEnsembleCourbes;

  2. #2
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Salut !

    Si tu as fait un copier-coller de ton code, à mon avis ça vient (peut-être entre-autres) de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int i=0;i<((*PtEC).nbcourbes);i++) 
    {
        LibererArbre(((*PtEC).TabDynC[i]).ArbreFonction);
        LibererArbre(((*PtEC).TabDynC[i]).ArbreFonction);
    }
    Qui devrait être, la seconde fois, ArbreDerivee.
    (là tu libères 2x le même arbre ...)

    Si c'est une erreur de recopiage, par pitié copiez-collez votre code !!


    Et sinon 2 petite remarques:

    * utilise au maximum l'operateur ->, ça simplifie la lecture
    (et évite les parenthèses inutiles)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (int i=0;i<((*PtEC).nbcourbes);i++)
    for (int i=0; i<PtEC->nbcourbes ;i++)
    * s'il te plait édite ton message pour utiliser la balise [ code ], ca sera beaucoup plus lisible

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    oui c'est une erreur le "ArbreDerivee" désolé.

    d'où peut venir le débordement de pile alors?

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Bonjour,
    Le débordement de pile vient très probablement de l'appel récursif sur LibererArbre. Comme son code semble être correct, il reste deux possibilités :
    -1 la récursion est trop profonde : arbres avec beaucoup d'éléments et peut être déséquilibrés
    -2 test d'arrêt non satisfait : if( a!= NULL)... et l'erreur est à chercher dans la construction des arbres
    Je ne vois pas d'autres possibilités, le nombre d'éléments du tableau ne devrait pas intervenir dans ce débordement

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    le bug arrive lorsqu'il y a 10 courbes au plus, pour 1 ça marche très bien, donc je penche pour la 1ère solution. mais je ne peux rien y faire alors?

  6. #6
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    le bug arrive lorsqu'il y a 10 courbes au plus, pour 1 ça marche très bien,
    Oui, mais le débordement de pile si il est du à la récursion ne dépend pas du nombre de courbes, mais du nombre d'éléments dans un arbre en fait de la profondeur de l'arbre. Tu dois avoir une idée de ces valeurs lorsque ton programme plante. Sinon, si c'est du à une trop grande profondeur des arbres, il reste la possibilité d'un code non recursif pour LibererArbre

  7. #7
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Il me semble (enfin ça serait logique) que le taille prise sur la pile dépend de la prondeur d'appel et de la taille des données locales. Vu que dans le cas de Libere_Arbre, il n'y a pas de variables locales, et un seul pointeur en parametre, c'est qu'il doit y avoir une sacré profondeur !
    Par défault, la pile alloué par la compilateur de Visual C++ est de 1Mo; on devrait pourvoir en stocker des appels...

    Pourrais-tu nous dire à peu près quelle est la profondeur de tes arbres ? Ou au moins un ordre de grandeur: 10, 100, 1000, 10000, ou plus ?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    bah écoute c'est un arbre syntaxique avecl a fonction d'une courbe avec +,-,cos,sin,... dans des noeud, constante ou variable dans les feuilles. j'ai essayé 10 courbes avec x+1 (à savoir que x et 1 auront chacun 2 fils mis à NULL donc la récursivité regardera aussi ses noeuds pour vori qu'il ne faut pas les free)

    après tes fonctions peuvent être dep lus en plus complexes et donc profondes. pour la dérivée c'est pareil puisqu'à partir de de 1+0 on aura 0+1 (car je dois utiliser +, -, *, /) comme des opérateurs binaires uniquement.

Discussions similaires

  1. Depuis EDI DELPHI : Access Violation
    Par powerlog dans le forum EDI
    Réponses: 1
    Dernier message: 03/08/2005, 16h59
  2. Access violation avec fseek
    Par baleine dans le forum C
    Réponses: 7
    Dernier message: 18/03/2005, 16h41
  3. Réponses: 7
    Dernier message: 22/02/2005, 13h07
  4. [DELPHI][PROECEDURES STOCKES] Access violation
    Par All Jinx dans le forum Bases de données
    Réponses: 6
    Dernier message: 14/05/2004, 15h57
  5. Réponses: 3
    Dernier message: 22/05/2002, 09h37

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