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

SL & STL C++ Discussion :

probleme de vector


Sujet :

SL & STL C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 31
    Par défaut probleme de vector
    bonjour debutant en c++ j'essai de réaliser le jeu du pendu:
    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
    #include <stdio.h>
    #include <curses.h>
    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
     
     
    class joueur
    {
    private:	
    	string nom;
    	int nb_points;
    	int etat_pendaison;
    public:
    	joueur(string name, int points, int etat);
    	~joueur();
    	string get_nom() const {return nom;}
    	int get_etat_pandaison() const {return etat_pendaison;}
    	int get_nb_points() const {return nb_points;}
    	string set_nom(string name) {nom=name;}
    	int set_etat_pandaison(int etat) {etat_pendaison=etat;}
    	int set_nb_points(int points) {nb_points=points;}
    };
     
    int main(int argv, char* argc[])
    {
    	int nb_joueur;
    	string nom_joueur;
    	//tableau d'objet joueur
    	vector<joueur> tab_nom_joueur;
    	cout <<"indiquer le nombre de joueur"<<endl;
    	cin >>nb_joueur;
     
    	for(int i=0;i<nb_joueur;i++)
    	{
    		cout <<"nom du joueur "<<i<<endl;
    		cin >> nom_joueur;
    		joueur* le_joueur = new joueur(nom_joueur,0,13);
    		tab_nom_joueur[*le_joueur];
    	}
    	exit(0);
    	return 0;
    }
    mais je n'arrive pas a céer mon tableau dynamique (vector) englobant mes objets joueurs.
    voici l'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [yvan@localhost c++]$ g++ pendu.cpp -o pendu
    pendu.cpp: In function `int main(int, char**)':
    pendu.cpp:39: error: no match for 'operator[]' in 'tab_nom_joueur[*le_joueur]'
    /usr/lib/gcc/i586-mandrake-linux-gnu/3.4.3/../../../../include/c++/3.4.3/bits/stl_vector.h:462: note: candidates are: typename _Alloc::reference std::vector<_Tp, _Alloc>::operator[](size_t) [with _Tp = joueur, _Alloc = std::allocator<joueur>]
    /usr/lib/gcc/i586-mandrake-linux-gnu/3.4.3/../../../../include/c++/3.4.3/bits/stl_vector.h:476: note:                 typename _Alloc::const_reference std::vector<_Tp, _Alloc>::operator[](size_t) const [with _Tp = joueur, _Alloc = std::allocator<joueur>]
    pendu.cpp:44:2: warning: no newline at end of file
    Lors d'un précédents programe j'ai du eviter d'utiliser les vectors car jamais un segmentation fault lors de l'exécution de mon programme.
    merci pour votre aide.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 31
    Par défaut
    j'ai rajoute les constructeurs et destructeurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    joueur:: joueur(string name, int points, int etat)
    {
    	nom = name;
    	nb_points = points;
    	etat_pendaison = etat;
    }
     
    joueur::~joueur()
    {
    }
    mais j'ai toujours une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [yvan@localhost c++]$ g++ pendu.cpp -o pendu
    pendu.cpp: In function `int main(int, char**)':
    pendu.cpp:50: error: no match for 'operator[]' in 'tab_nom_joueur[*le_joueur]'
    /usr/lib/gcc/i586-mandrake-linux-gnu/3.4.3/../../../../include/c++/3.4.3/bits/stl_vector.h:462: note: candidates are: typename _Alloc::reference std::vector<_Tp, _Alloc>::operator[](size_t) [with _Tp = joueur, _Alloc = std::allocator<joueur>]
    /usr/lib/gcc/i586-mandrake-linux-gnu/3.4.3/../../../../include/c++/3.4.3/bits/stl_vector.h:476: note:                 typename _Alloc::const_reference std::vector<_Tp, _Alloc>::operator[](size_t) const [with _Tp = joueur, _Alloc = std::allocator<joueur>]
    pendu.cpp:55:2: warning: no newline at end of file
    [yvan@localhost c++]$

  3. #3
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Salut !!

    je te conseil le tuto sur la STL qui est sur ce site (lien Cours et Tutoriels)...

    tu y trouveras notament toutes la doc sur les conteneurs de la STL C++ et à fortiori la fonction qui permet d'insérer oiu ajouter un élément dans ton vecteur...

    De plus, pointeur en C++.... C pas franchement nécessaire ici... beuark

    (pour info, on peut créer une variable dynamique à durée de vie optimisée en C++ sans les pointeurs en appellant directement la classe, comme pour les pointeurs en fait, mais sans new, et le type est sans pointeur..., avantage, dès que la variable n'est plus utilisée, elle est détruite...)

    Les pointeurs en C++, c'est seulement si c'est nécessaire (cf FAQ), ici, ce n'est pas le cas (pas de polymorphisme...)
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 31
    Par défaut
    merci pour tes conseils.
    en effet l'allocations dynamique ne sert a rien je l'ai remplacer par:
    tab_joueur.push_back(*(new joueur(nom_joueur,0,13)));

  5. #5
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    new == allocation dynamique...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab_joueur.push_back( joueur(nom_joueur,0,13) );
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  6. #6
    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
    De plus, pointeur en C++.... C pas franchement nécessaire ici... beuark Wink

    (pour info, on peut créer une variable dynamique à durée de vie optimisée en C++ sans les pointeurs en appellant directement la classe, comme pour les pointeurs en fait, mais sans new, et le type est sans pointeur..., avantage, dès que la variable n'est plus utilisée, elle est détruite...)
    Euh... Pour l'enregistrer dans Vector, tu ne peux pas passer par un objet détruit en fin de bloc, là... si? :

    Les pointeurs en C++, c'est seulement si c'est nécessaire (cf FAQ), ici, ce n'est pas le cas Wink (pas de polymorphisme...)
    Euh... est-il nécessaire de parler de ça ici?
    Le C++ semble aimer les références, et il semblerait de mauvais effet de dire "Les références, seulement là ou on ne peut pas utiliser les pointeurs" --> La conversation pourrait dériver en troll entre les partisans des uns et des autres
    (Ceux qui ont touché à la programmation sur calculatrices TI68K connaissent les débats Kernel/_nostub)
    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.

  7. #7
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Citation Envoyé par Médinoc
    Les pointeurs en C++, c'est seulement si c'est nécessaire (cf FAQ), ici, ce n'est pas le cas Wink (pas de polymorphisme...)
    Euh... est-il nécessaire de parler de ça ici?
    Le C++ semble aimer les références, et il semblerait de mauvais effet de dire "Les références, seulement là ou on ne peut pas utiliser les pointeurs" --> La conversation pourrait dériver en troll entre les partisans des uns et des autres
    (Ceux qui ont touché à la programmation sur calculatrices TI68K connaissent les débats Kernel/_nostub)
    lol, je veux pas troller, j'ai juste rappellé un passage de la FAQ, après, à part que j'aime pas les pointeurs (au même titre que j'aime pas VB, le procédural, les frites à la mayo, ou le prof d'info de S1), j'ai aucun autre argument perso lol, donc c'est pas moi qui trollera là dessus, en plus j'ai la flemme de chercher des arguments XD
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  8. #8
    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
    Swoög: OK, ne trollons pas. De plus, mes arguments sont en partie dérivés du fait que je n'aime pas le changement
    mais je persiste à trouver les références dangereuses pour la lisibilité du code, surtout là où des pointeurs font la même chose de manière bcp plus évidente (Mais ce n'est que ce que je pense)

    byvan: Oups, cross-post.
    Si j'ai bien compris, là, c'est une copie (constructeur de copie par défaut) de l'objet de type joueur qui est ajoutée au vector?
    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.

  9. #9
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Médinoc : comme tu le dis ne trollons pas, on va dire que c'est un choix perso, ta ligne était de trop... (même en size 1, si tu veux qu'on en discute, on le fait par MSN au pire )

    Sinon, c'est en effet une copie d'un joueur qui est stockée, les vector, comme tous les containers de la STL ne stockent que des copies, c'est pour cela que les classes utilisées doivent être copiables... [ie implémenter le constructeur de copie et l'opérateur = de manière visibles par le conteneur et de manière à obtenir un effet cohérent]

    en fait, les trois codes postés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    joueur* le_j = new joueur(params);
    joueurs.push_back(*le_j);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    joueurs.push_back(*(new joueur(params)));
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    joueurs.push_back( joueur(params) );
    Ont exactement le même effet.

    À ceci près que les objets joueurs utilisés par byvan constituent des fuites de mémoire, puisqu'ils ne sont jamais détruis, et que des copies sont faites... (les méthodes d'insertion dans les containers STL font toujours des copies d'après les standards...)

    Alors que ceux que j'utilise moi, le sont à la fin de l'instruction (au niveau du ';' normalement)

    Sinon, l'effet est exactement le même
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 31
    Par défaut
    Swoög tu a tout a fait raison les trois codes postés font ma meme chose, l'utilisation de new ne sert a rien. En faite je croyait que en c++ pour créer un objet on devait new comme en java. Si j'ai bien si j'utilise new je peut utiliser l'objet créer sans passer par le tableau mais sans le new j'utilise le tableau pour recupérer mon objet.
    J'arrive presqu'a la fin de mon programme

    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    #include <stdio.h>
    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
     
     
    class joueur
    {
    private:	
    	string nom;
    	int nb_points;
    	int etat_pendaison;
    public:
    	joueur(string name, int points, int etat);
    	~joueur();
    	string get_nom() const {return nom;}
    	int get_etat_pandaison() const {return etat_pendaison;}
    	int get_nb_points() const {return nb_points;}
    	string set_nom(string name) {nom=name;}
    	int set_etat_pandaison(int etat) {etat_pendaison=etat;}
    	int set_nb_points(int points) {nb_points=points;}
    };
     
    joueur:: joueur(string name, int points, int etat)
    {
    	nom = name;
    	nb_points = points;
    	etat_pendaison = etat;
    }
     
    joueur::~joueur()
    {
    }
     
    void proposition(string mot,int joueur_propose_mot,int nb_joueur,vector<joueur>& tab_joueur)
    {
    	//test pour savoir si le mot a été trouvé
    	int gagne = 0;
    	char lettre;
    	int i = 0;
    	//recupere les joueurs qui vont proposé des lettres 
    	//string mot_a_lecran= new string;
    	char* mot_a_lecran = new char;
    	//char* mot_a_lecran = new char(mot.size()*2);
    	//char mot_a_lecran[mot.size()*2];
    	int num_joueur[nb_joueur];
    	int longueur_mot = mot.size();
    	//cpt du nombre lettre trouvé
    	int cpt_long = 0;
    	//initialisation du mot_a_lecran
    	while(mot[i]!='\0')
    	{
    		mot_a_lecran[i]=(char)" -";
    		i++;
    	}
     
    	//recuperation des joueurs qui vont proposer un mot
    	int y=0;
    	for(i=0;i<nb_joueur;i++)
    	{
    		if (i!=joueur_propose_mot)
    		{
    			num_joueur[y] = i;
    			y++;
    		}
     
    	}
     
    	while(gagne==0)
    	{
    		//voici les proposition de mots
    		for(i=0;i<y;i++)
    		{
    			//sil le mot a deja été trouvé pas de proposition
    			if (gagne == 0)
    			{ 
    				int numero_joueur_propose_lettre = num_joueur[i];
    				if (tab_joueur[numero_joueur_propose_lettre].get_etat_pandaison()>0)
    				{
    					cout << "MOT : "<<mot_a_lecran<<endl;
    					cout << "Joueur "<< tab_joueur[numero_joueur_propose_lettre].get_nom()<< " proposer une lettre"<<endl;
    					cin >>lettre;
    					int x = 0;
    					bool trouve = false;
     
    					while(mot[x]!='\0')
    					{
    						if (mot[x] == lettre)
    						{
    							mot_a_lecran[x] = lettre;
    							trouve = true;
    							cpt_long++;
    						}
    						x++;
    					}
     
    					//une lettre a été trouvé
    					if (trouve == true)
    					{
    						cout << "Bravo: "<< mot_a_lecran<<endl; 
    					}else
    					{
    						cout << "Pas de chance :" <<endl;
    						tab_joueur[numero_joueur_propose_lettre].set_etat_pandaison(tab_joueur[numero_joueur_propose_lettre].get_etat_pandaison()-1);
    						cout << "Il vous reste  	"<<tab_joueur[numero_joueur_propose_lettre].get_etat_pandaison()<<" coups avant d'etre pendu"<<endl;
     
    					}
     
    					//le mot a été trouvé
    					if (longueur_mot == cpt_long)
    					{
    						cout << "-> Gagné" <<endl;
    						gagne = 1;
    						tab_joueur[numero_joueur_propose_lettre].set_nb_points(tab_joueur[numero_joueur_propose_lettre].get_nb_points()+2);
    					}	
    				}
    			}
    		}
     
    	}
    }
     
    int main(int argv, char* argc[])
    {
    	int nb_joueur;
    	string nom_joueur;
    	//tableau d'objet joueur
    	vector<joueur> tab_joueur;
    	//joueur tab_joueur[nb_joueur];
    	cout <<"indiquer le nombre de joueur"<<endl;
    	cin >>nb_joueur;
     
    	for(int i=0;i<nb_joueur;i++)
    	{
    		cout <<"nom du joueur "<<i+1<<endl;
    		cin >> nom_joueur;
    		tab_joueur.push_back(*(new joueur(nom_joueur,0,13)));
    		//tab_joueur.push_back(new joueur(nom_joueur,0,13));
    	}
     
    	for(int i=0;i<nb_joueur;i++)
    	{
    		string mot;
    		cout << "Au joueur "<<tab_joueur[i].get_nom() << " de proposer un mot"<<endl;
    		cout << "les autres joueurs ne regardent pas"<<endl;
    		cout <<"Entrer le mot :"<<endl;
    		cin >> mot;
    		//clear();
    		proposition(mot,i,nb_joueur,tab_joueur);
    	}
    	exit(0);
    	return 0;
    }
    mais j'ai une petite erreur dans l'execution de mon programme

    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
    pendu.cpp: In function `void proposition(std::string, int, int, std::vector<joueur, std::allocator<joueur> >&)':
    pendu.cpp:54: warning: cast from pointer to integer of different size
    pendu.cpp:154:2: warning: no newline at end of file
    [yvan@localhost c++]$ ./pendu
    indiquer le nombre de joueur
    3
    nom du joueur 1
    yvan
    nom du joueur 2
    toto
    nom du joueur 3
    max
    Au joueur yvan de proposer un mot
    les autres joueurs ne regardent pas
    Entrer le mot :
    cadeau
    MOT : žžžžžž
    Joueur toto proposer une lettre
    a
    Bravo: žažžaž
    MOT : žažžaž
    Joueur max proposer une lettre
    c
    Bravo: cažžaž
    MOT : cažžaž
    Joueur toto proposer une lettre
    d
    Bravo: cadžaž
    MOT : cadžaž
    Joueur max proposer une lettre
    e
    Bravo: cadeaž
    MOT : cadeaž
    Joueur toto proposer une lettre
    u
    Bravo: cadeau
    -> Gagné
    Au joueur toto de proposer un mot
    les autres joueurs ne regardent pas
    Entrer le mot :
    l'erreur vient de la methode proposition()
    a la ligne:
    char* mot_a_lecran = new char;

    En effet je ne comprend pas pourkoi un allouant un caractere il n'y a pas d'erreur (segmentation fault). La fonction new est telle différente du malloc en C.
    Lors de l'exution MOT : žžžžžž
    apparait au lieu de - - - - - -
    Merci pour vos reponses

  11. #11
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Pourquoi un seul caractère ? Tu ne veux pas copier ta chaine ? (et pourquoi la copier d'ailleurs)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 31
    Par défaut
    justement c ca que je comprend pas pourkoi mon programme marche en reservant 1 seul caractere? En faite j'ai deux chaine une pour celle ki est affiché a l'ecran et l'autre celle ke l'utilisateur entre.

  13. #13
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Yup !!

    N'oublie pas que tu es en C++... utilise string au lieu des char* pour ton mot à l'écran... ça sera plus simple je pense... et les strings ne finissent pas par un \0, tu as moyen de les parcourirs avec un for par exemple (GIYF)

    Utilise les booléen (bool) pour les variable ne pouvant prendre que deux valeurs

    pour ton erreur en elle même, tu t'es trompé de ligne...

    ça vient de la ligne : mot_a_lecran[i]=(char)" -";

    en effet, " -" est en fait un char* tu ne peux pas le convertir en char comme ça... passer par les string te serais bien plus simple... parce que je ne vois pas trop comment faire ce que tu souhaite faire autrement...

    personnellement, je ferais une classe mot_à_trouver, qui s'occuperais de créer le mot aléatoirement, de gérer quels caractères ont déjà étés trouvés, de valider ou non les propositions des joueurs, et du stade du pendu...

    De plus, défini bien tes règles pour le jeu

    Personellement, celle que je connais sont :

    On connait la première et la dernière lettre dès le départ.

    Chaque joueur peut proposer au choix une lettre ou un mot, si c'est une lettre, alors sont découvertes les positions de cette lettre dans le mot.

    si un joueur propose le mot à chercher, ou la dernière lettre il a gagné, si les joueurs font 11 fautes, ils ont perdu...

    ça c'est dans le cas, où le mot est généré aléatoirement, sinon, il faut gérer le joueur gagnant, etc...

    Ce serait cette classe qui possèderait une fonction "Proposes_mot" qui validerait les propositions des joueurs et une fonction "Afficher" qui afficherait le mot est le nombre d'echecs possibles restantes (càd l'état du pendu)

    il te suffirais alors de faire un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while(Jeu.status() == en_cours)
    {
       foreach(Joueur J)
       {
            Jeu.afficher();
           cout <<"Proposition de " <<J.nom() <<" : ";
           cin >>mot;
            Jeu.proposition(mot);
           if(Jeu.status() == gagne) { cout <<"le Joueur " <<J.nom() <<" a trouvé !!!"; return; }
        }
    }
    if(Jeu.status() == perdu) cout <<"Perdu !!! Dommage !";
    bon, c'est pas vraiment du C++, (foreach existe pas les valeurs pour status sont à revoir, etc...) mais en gros, ça serait l'algorithme que j'utiliserais, parce que en fait, je vois pas trop ce que fait ton programme (et notamment ta fonction proposition)

    De plus, tu utilises encore une allocation dynamique, ton application va avoir des fuites de mémoires...

    au fait : Quand est-ce que le mot est généré ?

    pour le reste, je te pose pas plus de questions, parce que je ne vois pas ce que fait ton programme, il faudrait qu'il soit un peu plus commenté...

    notamment sur que fait ta fonction proposition.. j'arrive pas trop à voir...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 31
    Par défaut
    Le mot est genéré dans le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for(int i=0;i<nb_joueur;i++)
    	{
    		string mot;
    		cout << "Au joueur "<<tab_joueur[i].get_nom() << " de proposer un mot"<<endl;
    		cout << "les autres joueurs ne regardent pas"<<endl;
    		cout <<"Entrer le mot :"<<endl;
    		cin >> mot;
                    proposition(mot,i,nb_joueur,tab_joueur);
    	}
    En effet il me reste le faite ke l'utilisateur peut entrer un mot.Pour l'instand je me contente ke l'utilisateur entre 1 lettre au maximum. Qu'est que t'entend pas fuite de mémoires?

  15. #15
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab_joueur.push_back(*(new joueur(nom_joueur,0,13)));
    comme je te l'ai expliqué plus haut, une allocation dynamique est faite, ensuite, la variable ainsi allouée est passée à tab_joueur.push_back comme paramètre, la fonction fait une copie de cette variable, or, tu ne conserves aucun pointeur sur cette variable, et elle n'est désallouée à aucun moment, tu as donc une fuite de mémoire, puisque tu as des variables auxquelles tu ne peux plus accèder qui ne sont pas désallouées...

    avec la ligne que je t'ai proposé plus haut, à savoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab_joueur.push_back( joueur(nom_joueur,0,13) );
    la variable n'est pas allouée dynamiquement, elle est créée dans la pile, comme une variable temporaire, et est détruite à la fin de l'instruction, seulle la copie stockée dans le vector est conservée, il n'y a donc pas de fuite...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  16. #16
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    au fait, concernant ta déclaration de mot_a_trouver

    si tu ne veux pas utiliser les string, c'est, semble-t-il, ta déclaration n°3 qui est bonne (char mot_a_lecran[size() * 2])

    par contre, le mot_a_lecran[x] = (char)" -"; est de toutes façons, invalide, il te faudrait faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mot_a_lecran[x] = ' ';
    mot_a_lecran[x+1] = '-';
    et n'oublie pas de détruit ta variable si tu utilise les pointeurs, sinon tu auras une fuite de mémoire !
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 31
    Par défaut
    Ok merci j'ai bien compris ce que c'était une fuite de mémoire.
    J'ai une derniere question kel est l'interet des pointeurs par rapport au tableau en c ou en c++?
    exemple

    int tab[80]
    int* tab = (int*) malloc(sizeof(int*80));
    free (tab);
    int* tab= new int[80]
    delete tab

  18. #18
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    tes trois déclarations sont équivalentes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int tab[80]; //création d'un tableau de 80 int, valide en C et en C++
    //ATTENTION, tab n'est pas détruit, possible fuite de mémoire !
     
    int* tab = (int*) malloc(sizeof(int*80)); //création d'un tableau de 80 int, instruction C
    free (tab); //destruction du tableau tab, instruction C
     
    int* tab= new int[80]; //création d'un tableau de 80 int, instruction C++
    delete tab; //destruction du tableau tab, instruction C++
    la seule différence, c'est que : n'est pas équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int* tab = new int[80];
    mais à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int* const tab = new int[80];
    différence subtile mais importante car :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int* tab = new int[80];
    ++tab; //OK car tab est de type int*
     
    int tab[80]; // OU : int* const tab[80];
    ++tab; //Pas OK, car tab est de type int[] qui est équivalent à int* const
    un int* est un pointeur (variable) sur un entier (variable) alors que int[] ou int* const est un pointeur constant sur un entier (variable)

    "Le mot clé const est appliqué à l'unité de typage le précedant. Si aucune unité de typage ne le précède, alors on intervertit const et le second mot de la ligne, et on applique la règle..." (c'est dans la FAQ et dans le standard C)
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 31
    Par défaut
    Merci pour t reponses.
    Si j'ai bien compris Tab[] et Tab* const permet de modifier la valeur mais pas la zone memoire pointé a la différence de int* qui peut modifier les 2.

  20. #20
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    exactement

    Bonne continuation ^^
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

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

Discussions similaires

  1. probleme avec vector
    Par guitariste dans le forum C++
    Réponses: 2
    Dernier message: 26/12/2007, 16h23
  2. probleme de vector
    Par jm49 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 15/06/2007, 16h04
  3. problem de vector avec une classe
    Par potterthekiller dans le forum SL & STL
    Réponses: 7
    Dernier message: 19/03/2007, 11h11
  4. probleme affichage vector
    Par byvan dans le forum Struts 1
    Réponses: 3
    Dernier message: 19/11/2006, 20h04
  5. probleme avec vector
    Par venomelektro dans le forum SL & STL
    Réponses: 16
    Dernier message: 16/08/2004, 23h39

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