CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++]Programme qui plante

Tithon
Tithon
Niveau 10
25 décembre 2014 à 19:58:05

Bonjour,
j'apprend le C++ et j'essaie de faire un petit programme (dans le seul but de m'entrainer) qui joue à "pierre,papier,ciseaux" seulement quand j'essaie de lancer le programme (il n'est pas finit mais pour voir où s'en est) ça me fais ça : https://image.noelshack.com/fichiers/2014/52/1419533821-capture-d-ecran-15.png
si je comprend bien l'opération nécessite trop de temps? mais à quoi cela est-il du?

Merci d'avance :oui:

Message édité le 25 décembre 2014 à 19:59:43 par Tithon
Enderith
Enderith
Niveau 9
25 décembre 2014 à 20:06:21

Attend on devine ton code ..

Tithon
Tithon
Niveau 10
25 décembre 2014 à 20:13:12

Je pensais que ce texte ne s'affichait que dans des cas précis :o))
le voici :

  1. include <iostream>
  2. include <string>
  3. include <ctime>
  4. include <cstdlib>

using namespace std;

int main()
{
string decision("oui");// si plus tard le joueur veut refaire une part
int pntProg(0);
int pntJoueur(0);

do
{

string chxPierre("pierre");
string chxPapier("papier");
string chxCiseaux("ciseaux");
string choixProg(0);
string choixJoueur(0);

srand(time(0));
int nbrProg;

nbrProg = rand() % 3;//tire un chiffre qui décidera indirectement si l'ordinateur choisit pierre papier ou ciseaux.
cout<<"pierre,papier,ciseaux..."<<endl;
cin>>choixJoueur;

if(nbrProg == 0)//le choix de l'ordinateur dépend du chiffre tiré par la fonction srand time.
{
choixProg == chxPierre;
cout<<chxPierre<<"!"<<endl;

}
else if(nbrProg == 1)
{
choixProg == chxPapier;
cout<<chxPapier<<"!"<<endl;
}
else if(nbrProg == 2)
{
choixProg == chxCiseaux;
cout<<chxCiseaux<<"!"<<endl;
}
//ici rajouter le truc pour que le programme voit si c'est égal etc

cout<<"points joueur :"<<pntJoueur;
cout<<" points Ordinateur :"<<pntProg;
cout<<"voulez vous refaire une partie?"<<endl;
cin >>decision;

}while(decision != "non");

return 0;
}
:d) vers la fin c'est ce que je disais qui n'étais pas terminé :noel:, je me dis que si le programme plante pour une raison que je ne comprend pas ça ne vaux pas la peine de le terminer pour le moment

Pseudo supprimé
Pseudo supprimé 25 décembre 2014 à 21:38:05

Cette ligne :

choixProg == chxCiseaux;

ça devrait être (un seul égal) :

choixProg = chxCiseaux;

Et également à cette ligne :
choixProg == chxPapier;

faut qu'un seul égal

et fait plutôt un screen du code source que un C/C car on ne voit pas les couleurs ni l'indentation et c'est perturbant.

Essaye aussi d'héberger ton code sur http://pastebin.com

et encore :
n'écris pas ça comme ça :
cout<<chxPapier<<"!"<<endl;

mais plutôt comme ça :

cout << chxPapier << "!" << endl; (les espaces c'est important !)

Message édité le 25 décembre 2014 à 21:40:57 par Pseudo supprimé
Ace_Attorney
Ace_Attorney
Niveau 10
25 décembre 2014 à 22:03:12

On va partir depuis le début.

Ton programme a été arrêté suite à une levée d'exception quelque part dans ton programme, de type std::logic_error.

Maintenant, on remarque dans la méthode "what()" que la chaine de caractère retournée est basic_string::_S_construct null is not valid.

Globalement, ce message d'erreur signifie que pour le constructeur de string, string(const char *), tu lui envoies la valeur NULL, hors, il ne peut pas copier une chaine de caractère qui est vide. (string n'est pas magique, au fond, ce n'est qu'une grosse surcouche des pointeurs sur char)

Donc pour éviter tout bug et/ou crash, il retourne une exception de type std::logic_error.

Tu as donc deux solutions, sois-tu catch l'erreur, en faisant ce style de code.

try
{
   // Ton code original
}
catch (std::logic_error &/* */)
{
}

Soit, pour ce morceau de code donné.

string choixProg(0);
string choixJoueur(0);

Tu ne lui envoies pas zéro, mais sois-tu ne l'initialise pas, sois-tu lui envoies une chaine de caractère vide.
Pourquoi ? car en C++, 0 est l'équivalent de NULL.

D'ailleurs, simple conseil, mais évites d'assigner des variables à 0, hormis pour les types numériques, si tu veux initialiser un pointeur à 0, utilises plus nullptr.

Tithon
Tithon
Niveau 10
25 décembre 2014 à 22:15:29

Merci pour vos réponses :) , l'erreur était bel et bien aux string, on ne peut donc pas envoyer une valeur nulle.
je ne savais pas que ce genre de faute n'étaient pas repérée par le débuggeur :(

En tout cas merci :ok:

sg-5
sg-5
Niveau 12
25 décembre 2014 à 23:02:21

Essaie de remplacer ta ribambelle de if else avec un switch(), ça sera plus propre aussi :hap:
("condition switch" sur openclassrooms, tuto c++)

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment