Plantage lors de l'exécution !

Résolu
mliuej Messages postés 9 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 6 janvier 2010 - 29 déc. 2009 à 16:43
mliuej Messages postés 9 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 6 janvier 2010 - 30 déc. 2009 à 13:29
Bonjour à tous,

Voici une fonction simple qui est sensée enregistrer un objet "Visiteur" ainsi qu'un objet "BilletEntree", et les afficher tous les deux (pour le moment). Le problème est que ça plante lors de l'exécution : plus précisément lors de la ligne "cin>>n;"... Lorsque je mets cette commande en commentaire, ça plante lors du premier "cin" rencontré.

Voici mon bout de code :

void AchatBillet()
{
    fl<<"Achat d'un billet";
        
    system("cls");
    char *n=new char[50], *p=new char[50], *dn=new char[50], *nv=new char[50], *nb=new char[50], *db=new char[50];

    cout<<endl<<"Achat d'un nouveau billet : ";
    cout<<endl<<"----------------------------"<<endl<<endl;
    
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    
    cout<<"Veuillez entrer le nom du visiteur : ";
    cin>>n;
    cout<<"Veuillez entrer le prenom du visiteur: ";
    cin>>p;
    cout<<"Veuillez entrer la date de naissance du visiteur: ";
    cin>>dn;
    cout<<"Veuillez entrer le numero du visiteur : ";
    cin>>nv;
    cout<<"Merci !"<<endl<<endl;

    Visiteur v1(n, p, dn, nv);
    v1.affiche();

    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    
    cout<<"Veuillez entrer le numero du billet : ";
    cin>>nb;    
    cout<<"Veuillez entrer la date de validite du billet : ";
    cin>>db;    
    cout<<"Merci !"<<endl<<endl;
    
    BilletEntree _be(v1, nb, db);
    _be.affichage();
    
    system("PAUSE");
}


En principe les constructeurs sont bons (et de toute façon le problème ne se situe pas là) mais je vous les montre tout de même :

Visiteur::Visiteur(char *nom, char *prenom, char *datenaissance, char *numerovisiteur) : Personne (nom, prenom, datenaissance)
{
    NumeroVisiteur = new char [strlen(numerovisiteur)+1];
    setNumeroVisiteur(numerovisiteur);
}


BilletEntree::BilletEntree(Visiteur v, char* numB, char* dateB)
{
    setnumeroBillet(numB);
    setdateBillet(dateB);
    setnomVisiteur(v.getNom());
    setprenomVisiteur(v.getPrenom());                                 
}


Bonne soirée !

5 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
30 déc. 2009 à 12:46
Je pense que ça vient du constructeur de Visiteur.
Tu appelles des éléments qui devraient être appelés uniquement par le constructeur de Personne.

Visiteur::Visiteur(string n, string p, string dn, string nv) : Personne(no, pr, da)


Ici no, pr et da, non pas à être appelé.

Visiteur::Visiteur(string n, string p, string dn, string nv) : Personne(n, p, dn)


Serait préférable.

J'arrive à le faire fonctionner avec ceci:

#include 

class Personne
{
public:
  Personne (const std::string& n, const std::string& p, const std::string& d)
    : no(n), pr(p), da(d)
  {
  }
private:
  std::string no;
  std::string pr;
  std::string da;
};

class Visiteur : public Personne
{
public:
  Visiteur(const std::string& n, const std::string& p,
   const std::string& dn, const std::string& nv)
    : Personne(n, p, dn), numvis(nv)
  {
  }
private:
  std::string numvis;
};

void AchatBillet()
{
  using std::string;
  using std::cin;
  using std::cout;
  using std::endl;

//   fl<<"Achat d'un billet";

  string n, p, dn, nv;

  cout<<endl<<"Achat d'un nouveau billet : ";
  cout<<endl<<"----------------------------"<<endl<<endl;

//   pause();

  cout<<"Veuillez entrer le nom du visiteur : ";
  cin>>n;
  cout<<"Veuillez entrer le prenom du visiteur: ";
  cin>>p;
  cout<<"Veuillez entrer la date de naissance du visiteur: ";
  cin>>dn;
  cout<<"Veuillez entrer le numero du visiteur : ";
  cin>>nv;
  cout<<"Merci !"<<endl<<endl;

  Visiteur v1(n, p, dn, nv);
//   v1.affiche();

//   pause();
}

int main()
{
  AchatBillet();
  return 0;
}
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
30 déc. 2009 à 11:45
Je n'ai pas regardé en détail ce qui n'allait pas, mais une chose est sûre:
Arrête d'utiliser des char* !!! Tu as des std::string, bien meilleurs (ils gèrent leur taille tous seul, et sont capable de réaliser bien plus d'opérations).

Commence par remplacer:
char *n=new char[50], *p=new char[50], *dn=new char[50], *nv=new char[50], *nb=new char[50], *db=new char[50];


Par
std::string n;
std::string p;
std::string dn;
std::string nv;
std::string nb;
std::string db;


Une fois que tu as remplacé tout tes char* par des std::string, tu ne devrais plus avoir le problème. S'il persiste, reposte ici et je t'aiderais.

Evite les appels à "system". C'est un peu dommage d'avoir une très bonne approche pour faire une pause, et d'appeler ensuite system("pause");

Je te conseille d'utiliser la fonction suivante:
void pause()
{
  cin.clear();
  cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
0
mliuej Messages postés 9 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 6 janvier 2010
30 déc. 2009 à 12:33
Merci pour ta réponse. J'ai remplacé les char* par les string mais le programme plante toujours. Voici mes bouts de code :

void AchatBillet()
{
    fl<<"Achat d'un billet";
        
    system("cls");
    string n, p, dn, nv;

    cout<<endl<<"Achat d'un nouveau billet : ";
    cout<<endl<<"----------------------------"<<endl<<endl;
    
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    
    cout<<"Veuillez entrer le nom du visiteur : ";
    cin>>n;
    cout<<"Veuillez entrer le prenom du visiteur: ";
    cin>>p;
    cout<<"Veuillez entrer la date de naissance du visiteur: ";
    cin>>dn;
    cout<<"Veuillez entrer le numero du visiteur : ";
    cin>>nv;
    cout<<"Merci !"<<endl<<endl;

    Visiteur v1(n, p, dn, nv);
    v1.affiche();

    pause();
}


Visiteur::Visiteur(string n, string p, string dn, string nv) : Personne(no, pr, da)
{
    numvis = nv;
}


Personne::Personne (string n, string p, string d)
{
    no = n;
    pr = p;
    da = d;
}


J'ai remplacé mes system("PAUSE") par ta fonction pause(), mais elle n'a pas le même effet puisqu'aucune pause n'est réalisée
0
mliuej Messages postés 9 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 6 janvier 2010
30 déc. 2009 à 12:37
Désolé pour le double post mais je n'ai pas trouvé la fonction "éditer".

Je précise que le programme plante juste après avoir dit "Merci !", donc au moment de créer l'objet Visiteur (j'ai essayé de mettre la fonction affiche en commentaire, mais ça plante bien au moment de créer le Visiteur).

Seconde remarque, j'utilise toujours pour le moment using namespace std, je modifierai ça sous peu
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mliuej Messages postés 9 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 6 janvier 2010
30 déc. 2009 à 13:29
Merci pour ta réponse, ça fonctionne maintenant. Je vais remplacer tous les char* de mon projet par des string

A bientôt pour d'autres questions
0
Rejoignez-nous