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 :

un bug introuvable


Sujet :

C++

  1. #1
    Membre régulier Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Points : 106
    Points
    106
    Par défaut un bug introuvable
    Voila
    ce code se compile correctement, mais à la fin l'invite de commande gèle:
    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
    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<strings.h>
     
     
     
    using namespace std;
     
    class Personne
    {
    private:
        char * nom;
        char * pnom;
        int age;
    public:
        Personne();
        Personne(char * n, char * p, int a);
        ~Personne();
        //void Modif(Personne& p);
        void Affich();
    };
     
    Personne::Personne()
    {
        nom = new char[6];
        nom = "userN";
        pnom = new char[5];
        pnom = "userP";
        age = 10;
    }
     
    Personne::Personne(char * n, char * p, int a)
    {
        nom = new char[strlen(n)];
    	strcpy(nom, n);
     
        pnom = new char[strlen(p)];
    	strcpy(pnom, p);	
    	age = a;
     
    }
     
    Personne::~Personne()
    {
    	delete[] nom;
    	delete[] pnom;
    }
    void Personne::Affich()
    {
        cout << "\nNom: " << nom << endl;
        cout << "Prenom: " << pnom << endl;
        cout << "Age: " << age << endl;
    }
    int main()
    {
    	char *uname;
    	uname = new char[12];
            cin >> uname;
     
        Personne p(uname, "toto", 24);
        Personne a;
     
        a.Affich();
        p.Affich();
     
    	delete[] uname;
        getchar();
    }
    d'où ça peut venir?

    merci

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Lae,

    Sans avoir tout lu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Personne::Personne(char * n, char * p, int a)
    {
        nom = new char[strlen(n)];
    	strcpy(nom, n);
     
        pnom = new char[strlen(p)];
    	strcpy(pnom, p);	
    	age = a;
     
    }
    il faut réserver strlen(n) +1 pour la nouvelle chaîne (ne jamais oublier le 0 final ).
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    d'où l'utilité d'utiliser des std::string !
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Gao,
    Citation Envoyé par Davidbrcz Voir le message
    d'où l'utilité d'utiliser des std::string !
    Évidemment
    Si les cons volaient, il ferait nuit à midi.

  5. #5
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    pour moi ça marche mais ça doit être un coup de chance.

    En effet, ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        nom = new char[6];
        nom = "userN";
        pnom = new char[5];
        pnom = "userP";
        age = 10;
    Apparemment tu n'as pas tout saisi, désolé.
    Pour copier une chaine dans une autre, ça ferait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        nom = new char[6];
        strcpy(nom, "userN");
        pnom = new char[6];
        strcpy(pnom, "userP");
        age = 10;
    Ce que tu faisais, c'est que tu mettais l'équivalent d'un const char * dans ton pointeur, et donc ton pointeur pointe vers une autre zone maintenant, celle où il y a écrit "userN". Du coup plus rien ne pointe vers la mémoire allouée dynamiquement, et quand tu fais un delete [] sur un const char * ça a de grandes chances de planter...

    Je ne suis peut-être pas très clair, mais regarde dans ton bouquin les const char *, et la recopie d'une chaîne dans une autre, il expliquera ça mieux que moi.

    Sinon les autres remarques sont valides, (strlen+1 au lieu de strlen), et il manque un 'return 0' à la fin de ton main.

    Une fois tout ça fait, tout va bien:

    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
    #include<iostream>
    #include<string.h>
     
    using namespace std;
     
    class Personne
    {
    private:
        char * nom;
        char * pnom;
        int age;
    public:
        Personne();
        Personne(char * n, char * p, int a);
        ~Personne();
        //void Modif(Personne& p);
        void Affich();
    };
     
    Personne::Personne()
    {
        nom = new char[6];
        strcpy(nom, "userN");
        pnom = new char[6];
        strcpy(pnom, "userP");
        age = 10;
    }
     
    Personne::Personne(char * n, char * p, int a)
    {
        nom = new char[strlen(n)+1];
    	strcpy(nom, n);
     
        pnom = new char[strlen(p)+1];
    	strcpy(pnom, p);
    	age = a;
     
    }
     
    Personne::~Personne()
    {
    	delete[] nom;
    	delete[] pnom;
    }
    void Personne::Affich()
    {
        cout << "\nNom: " << nom << endl;
        cout << "Prenom: " << pnom << endl;
        cout << "Age: " << age << endl;
    }
    int main()
    {
        cout << "Entrez votre nom: ";
     
    	char *uname;
    	uname = new char[12];
            cin >> uname;
     
        Personne p(uname, "toto", 24);
        Personne a;
     
        a.Affich();
        p.Affich();
     
    	delete[] uname;
        getchar();
     
        return 0;
    }

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Meo,
    Citation Envoyé par coyotte507 Voir le message
    pour moi ça marche mais ça doit être un coup de chance.
    Moi, j'appelle ça de la malchance, car c'est un programme buggé, au comportement indéfini, et qui semble fonctionner normalement, alors que...
    Si les cons volaient, il ferait nuit à midi.

  7. #7
    Membre régulier Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Points : 106
    Points
    106
    Par défaut
    Citation Envoyé par coyotte507 Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        nom = new char[6];
        nom = "userN";
        pnom = new char[5];
        pnom = "userP";
        age = 10;
    Apparemment tu n'as pas tout saisi, désolé.
    Pour copier une chaine dans une autre, ça ferait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        nom = new char[6];
        strcpy(nom, "userN");
        pnom = new char[6];
        strcpy(pnom, "userP");
        age = 10;
    Ah oui, j'avais confondu la syntaxe de char avec celle de string..
    Quoi qu'il arrive merci à vous tous! ;-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/04/2009, 11h10
  2. Plusieurs bugs introuvables(pour moi)
    Par phast dans le forum Qt
    Réponses: 3
    Dernier message: 22/12/2008, 22h39
  3. Réponses: 1
    Dernier message: 03/09/2008, 18h22
  4. bug introuvable - UIBExpert - Firebird
    Par simoryl dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/04/2006, 03h27
  5. [Ajax] Bug introuvable
    Par Davboc dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 09/02/2006, 11h09

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