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 :

"Call Stack" trouvé pendant un débugage


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant à l'école 42
    Inscrit en
    Avril 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant à l'école 42

    Informations forums :
    Inscription : Avril 2013
    Messages : 59
    Par défaut "Call Stack" trouvé pendant un débugage
    Bonjour,

    J'ai voulu raccourci un morceau de code qui ressemblait en gros a sa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(c[63]==longchaine) { c[62]++; c[63]=0; }
    if(c[62]==longchaine) { c[61]++; c[62]=0; }
    ...
    if(c[2]==longchaine) { c[1]++; c[2]=0; }
    if(c[1]==longchaine) { c[1] = 0; }
    (Je tiens a préciser qu'avec ce morceau de code ci-dessus mon programme fonctionne parfaitement)

    Par ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    while(continuer2==0)
    {
        if(c[i]==longchaine)
        {
            c[i]=0;
            c[i-1]++;
        }
        i--;
        if(i==1)
        {
            if(c[1]==longchaine) { c[1] = 0; }
            continuer2=1;
         }
    }
    (C'est donc ce morceau qui créer un bug, et pourtant...(voir la suite))

    Cependant mon programme plante après un moment d'exécution. Je lance donc le Debug sur Code::Blocks et il me trouve un "Call Stack", je vous copie/colle le détail :

    #0 00401580 creation(nomchaine=0x22fdcd "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", longchaine=36) (C:\Chemin_vers_programme\main.cpp:52)
    #1 00401D9B main() (C:\Chemin_vers_programme\main.cpp:216)
    L'endroit de la ligne 52 (pour le 1er Call Stack) correspond a ce morceau de code qui est dans ma fonction "void creation(char *nomchaine, int long chaine)" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(f6<=f5)
    {
        fputc(nomchaine[c[f6]], fichier);
        f6++;
    }
    L'endroit de la ligne 216 (pour le 2e Call Stack), dans le main, correspond a l'appel de ma fonction "creation".

    Le bug ne provient donc pas du nouveau morceau de code, mais c'est a cause de lui que le bug apparaît...

    Quelqu'un aurait une idée d'où peut venir le problème svp ?

    Cordialement,

  2. #2
    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
    Je pense qu'il va falloir montrer plus de code que ça.
    Y compris l'initialisation de i, le contenu de tes variables f5 et f6...
    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.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant à l'école 42
    Inscrit en
    Avril 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant à l'école 42

    Informations forums :
    Inscription : Avril 2013
    Messages : 59
    Par défaut
    f5 contient la taille de la chaîne qui sera écrite dans mon fichier
    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
    void creation(char *nomchaine, int longchaine)
    {
         int c[63] = {0};
         int f5;
         int f6;
         int i = 63;
         char retour = '\n';
     
         f6 = 1;    
         while(f6<=f5)
         {
             fputc(nomchaine[c[f6]], fichier); //Ligne qui pose problème quand nouveau morceau de code implanter
             f6++;
         }
         fputc(retour, fichier);
     
         c[f5]++;
     
         i=63; //Début nouveau morceau de code
         while(continuer2==0) 
         {
             if(c[i]==longchaine)
             {
                 c[i]=0;
                 c[i-1]++;
             }
             i--;
             if(i==1)
             {
                 if(c[1]==longchaine) { c[1] = 0; }
                 continuer2=1;
             }
         } //Fin nouveau morceau code
    }
    int main()
    {
        char un[] = {*plein de caractères*,'\0'};
        char deux[] = {*plein de caractères*,'\0'};
        char trois[] = {*plein de caractères*,'\0'};
        char quatre[] = {*plein de caractères*,'\0'};
        int menu = 0;
        cin >> menu;
     
        if(menu==1) { creation(un,166); }
        else if(menu==2) { creation(deux,62); }
        else if(menu==3) { creation(trois,36); }
        else if(menu==4) { creation(quatre,36); }
        return 0;
    }

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant à l'école 42
    Inscrit en
    Avril 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant à l'école 42

    Informations forums :
    Inscription : Avril 2013
    Messages : 59
    Par défaut
    J'ai aussi sa dans le debug :
    Program received signal SIGSEGV, Segmentation fault.
    At C:\Chemin_vers_fichier\main.cpp:52
    Et a la ligne 52 c'est ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fputc(nomchaine[c[f6]], fichier);
    Donc le problème viendrait de mon pointeur "char *nomchaine" dans "void creation(char *nomchaine, int longchaine);"

  5. #5
    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
    c[63] n'est pas une expression valide.
    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.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant à l'école 42
    Inscrit en
    Avril 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant à l'école 42

    Informations forums :
    Inscription : Avril 2013
    Messages : 59
    Par défaut
    Pourtant c'est dans un autre topic sur ce forum (http://www.developpez.net/forums/d13...s/#post7333757) que l'on m'a dit que cela était possible.
    Et c'est ceci qui raccourci la déclaration des mes 63 variables.

    Par quoi je pourrai le remplacer dans ce cas ?

  7. #7
    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
    Je me suis mal exprimé.

    Je voulais dire que c[i] n'est pas valide quand i = 63.
    Les indices du tableau vont de 0 à 62.
    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.

  8. #8
    Membre confirmé
    Homme Profil pro
    Étudiant à l'école 42
    Inscrit en
    Avril 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant à l'école 42

    Informations forums :
    Inscription : Avril 2013
    Messages : 59
    Par défaut
    Ah en effet, je me suis trompé... Je devrais plus commenter mon code...

    Merci beaucoup de votre aide

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant à l'école 42
    Inscrit en
    Avril 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant à l'école 42

    Informations forums :
    Inscription : Avril 2013
    Messages : 59
    Par défaut
    Je retire ce que j'ai dis...

    Après ta remarque Medinoc j'ai donc modifier mon code et principalement mon comme ceci : Cependant une erreur apparaît au moment de la compilation :
    C:\Chemin_vers_fichier\main.cpp|10|error: variable-sized object 'c' may not be initialized|
    Je pense que c'est parce que le compilateur ne connaît pas la variable "longchaine" au moment de la compilation, mais je ne suis pas sur. Si c'est ça, comment résoudre ce problème ?

  10. #10
    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
    Avec l'allocation dynamique (new[]) ou en utilisant un std::vector<int> au lieu de ton tableau.
    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.

  11. #11
    Membre confirmé
    Homme Profil pro
    Étudiant à l'école 42
    Inscrit en
    Avril 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant à l'école 42

    Informations forums :
    Inscription : Avril 2013
    Messages : 59
    Par défaut
    Avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<int> c(longchaine,0);
    cela ne fonctionne pas visiblement car j'ai toujours l'erreur au niveau du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    f1 = longchaine;
    fputc(nomchaine[c[f1]], fichier);

    Pour l'allocation dynamique je ne sais pas comment ça fonctionne. J'ai regarder le principe de fonctionnement et j'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int *c = new int[longchaine];
    Mais sans succès, encore la même erreur qu'au dessus.

    Peut-être ai-je fais une erreur quelque part ?

  12. #12
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    vector<int> c(longchaine,0);
    f1 = longchaine;
    fputc(nomchaine[c[f1]], fichier);
    Le vector a une longeur de longchaine en indice de base 0, donc c[longchaine] est invalide (après la fin du vector...)

  13. #13
    Membre confirmé
    Homme Profil pro
    Étudiant à l'école 42
    Inscrit en
    Avril 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant à l'école 42

    Informations forums :
    Inscription : Avril 2013
    Messages : 59
    Par défaut
    Dans ce cas le vector n'est pas adapté à mon programme puisque je suis obligé de mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    f1 = longchaine;
    fputc(nomchaine[c[f1]], fichier);
    Dans mon programme pour qu'il réalise la fonction voulue.

  14. #14
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    pour que c[longchaine] soit défini il suffit de déclarer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector c(longchaine+1,0)
    Par ailleurs, que cherches tu à faire?
    Parce que là, ce que tu vas faire c'est écrire le premier caractère de la chaine (tu remplis ton vector de 0) un nombre indéfini de fois (int f5; --> f5 contient n'importe quoi...donc ton while f6<=f5 fera n'importe quoi) jusqu'à ce que ton itération t'amène à un indice invalide qui plante tout...

  15. #15
    Membre confirmé
    Homme Profil pro
    Étudiant à l'école 42
    Inscrit en
    Avril 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant à l'école 42

    Informations forums :
    Inscription : Avril 2013
    Messages : 59
    Par défaut
    Ce que je cherche à faire c'est écrire les c[longchaine] caractères du char sélectionné par l'utilisateur dans le fichier texte.

    Je veux qu'il y ait c[longchaine] initialisé pour que le nombre de c[] correspondent aux nombres de caractères qu'il y a dans le char qui a été choisie par l'utilisateur.

    Chaque c[] au début contient le premier caractère du char choisie. Puis au fur et a mesure des boucles le dernier c[] est incrémenté et dès que celui-ci atteins longchaine on incrémente le c[] précédent puis on met le c[] qui viens d'atteindre longchaine a 0. Et ceci jusqu'à ce que c[1] atteigne longchaine, et la le programme se termine.


    J'ai oublié de mettre un bout de code mais f5 contient la taille de la chaîne qui va être généré (de 8 à 63 caractères), aucun rapport avec les char contenant les chaînes de caractères.

    C'est donc ce morceau de code qui a pour but d'écrire ces caractères dans le fichier texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    f6 = 0;
    f1 = longchaine;
    while(f6<=f5)
    {
        fputc(nomchaine[c[f1]], fichier);
        f1--;
        f6++;
    }
    fputc(retour, fichier);
    Et ceci incrémente le denier caractère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    f1=longchaine;
    c[f1]++;
    Et le morceau suivant vérifie si un c[] a atteins longchaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    while(continuer2==0)
    {
        if(c[i]==longchaine)
        {
            c[i]=0;
            c[i-1]++;
         }
         i--;
         if(i==1)
         {
             if(c[1]==longchaine) { c[1] = 0; }
             continuer2=1;
         }
    }

  16. #16
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    A mon humble avis, tu te compliques la vie.
    En c++, je dirais que ça s'écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <fstream>
    ...reste du code
    void creation(const char * const nomchaine, const char* const nomfichier){
       std::ofstream fichier(nomfichier);
       fichier<<nomchaine<<std::endl;
    }
    Si veux en savoir plus, tu peux aller voir par là, par exemple:
    http://www.cplusplus.com/reference/fstream/

  17. #17
    Membre confirmé
    Homme Profil pro
    Étudiant à l'école 42
    Inscrit en
    Avril 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant à l'école 42

    Informations forums :
    Inscription : Avril 2013
    Messages : 59
    Par défaut
    Oui mais la le code que tu me propose la va écrire directement toute la chaîne dans le fichier si j'ai bien compris ?

    Et ce n'est pas ce que je veux ^^

    Ton code va écrire ceci dans le fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    A
    B
    C
    D
    ...
    8
    9
    0
    Or moi je veux que mon code fasse ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    AAAAAAAA
    AAAAAAAB
    AAAAAAAC
    ...
    AAAAAAA9
    AAAAAAA0
    AAAAAABA
    EDIT : Je me suis rendu compte que quand je ne lançais pas le debug, mais que je lançais le programme celui-ci tournais un moment en écrivant comme il faut dans le fichier mais qu'entre temps nomchaine changeait....

  18. #18
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Citation Envoyé par Iron-Avenger Voir le message
    Ton code va écrire ceci dans le fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    A
    B
    C
    D
    ...
    8
    9
    0
    en fait, non, il va écrire la chaîne tout bêtement. JE n'avais pas capté que tu faisais de la combinatoire
    Concernant le dimensionnement, vector ou tableau il faut que tu retiennes que les indices étant en base 0, si tu utilises la dimension n les indices valides sont dans [0;n-1]. Par conséquent si tu veux que ton tableau ou vector ait un emplacement valide d'indice longeurchaine, il faut le dimensionner à longeurchaine+1.
    Mais ça irait aussi bien en initialisant à 0 et en s'arrêtant à longeurchaine-1
    C'est la raison de tes plantages: des dépassement d'indices qui t'amènent dans des parties de la mémoire non initialisées et là comme tu utilises des indices pour récupérer des indices tu as très vite des résultats...explosifs
    Dans l'ensemble je dirais que tu devrais réfléchir à ton algorithme global, à mon avis il y a moyen de l'écrire de manière plus simple et donc plus facile à comprendre et à débugger.

  19. #19
    Membre confirmé
    Homme Profil pro
    Étudiant à l'école 42
    Inscrit en
    Avril 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant à l'école 42

    Informations forums :
    Inscription : Avril 2013
    Messages : 59
    Par défaut
    Je vais réfléchir à ça.

  20. #20
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Sinon, quitte à vouloir écrire du C++, pourquoi ne pas en écrire pour de vrai ?

    Déjà qu'en C je trouve limite l'utilisation de fputc alors qu'on a fwrite, mais en C++ on a carrément les stream qui surchargent les opérateurs >> et << qui font ça encore mieux.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Obtenir call stack d'un programme java/C++ ?
    Par SteelBox dans le forum Linux
    Réponses: 22
    Dernier message: 26/11/2006, 20h16
  2. [Visual 2005]call stack
    Par ep31 dans le forum Visual C++
    Réponses: 3
    Dernier message: 19/09/2006, 16h16

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