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 :

Dépassement de mémoire ? Ecriture dans un objet x involontaire


Sujet :

C++

  1. #1
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut Dépassement de mémoire ? Ecriture dans un objet x involontaire
    Bonjour,

    je dois (à mon grand désespoir) rendre un TP en C++, et on a du mal à être copain tous les deux.

    Mon code (.h) :
    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
     
    class Case
    {
    public:
    	bool Occupe;
    	int IdentifiantJoueur;
    	double Coefficient;
     
    	int Position;
     
    	stack<int> EtatsForUndo; 
     
    	Case();
    	Case(bool oqp, int idJoueur, double coef, int pos);
    };
     
    class Virus
    {
    private:
    	int TaillePlateau;
     
     
    	int CalculerPossession(int color);
     
    public:
    	Case *plateau[];
    	 Virus(int taille);
     
    	 bool VerifierValiditeCoup(int x, int y, int color);
    	 int AlphaBeta(int depth, int alpha, int beta, int color, list<Case> & meilleursCoups);
    	 void PlayMove(Case c, int color, bool savePositions);
    	 void UndoMove();
    	 void FindLegalMoves(list<Case> & moves, int color);
    	 int Evaluate(int color);
    	 void ComblerEspaces(int color);
    	 int GetTaillePlateau();
    };
    Code bis (.cpp)
    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
     
    Case::Case(bool oqp, int idJoueur, double coef, int pos)
    :Occupe(oqp),IdentifiantJoueur(idJoueur),Coefficient(coef), Position(pos)
    {
    }
     
     
    Case::Case()
    :Occupe(false), IdentifiantJoueur(0), Coefficient(1.0), Position(0)
    {
    }
     
     
    Virus::Virus(int taille)
    :TaillePlateau(taille)
    {
    	*plateau = new Case[TaillePlateau*TaillePlateau];
     
    	for(int i = 0; i < TaillePlateau*TaillePlateau; i++)
    		plateau[i] = new Case(false, VIDE, 1.0, i);
     
    	plateau[0] = new Case(true, HUMAIN, 1.0, 0);
     
    	plateau[TaillePlateau-1] = new Case(true, IA, 1.0, TaillePlateau-1);
     
    	plateau[TaillePlateau*TaillePlateau -1] = new Case(true, HUMAIN, 1.0, TaillePlateau*TaillePlateau -1);
     
    	plateau[TaillePlateau*TaillePlateau -TaillePlateau] = new Case(true, IA, 1.0, TaillePlateau*TaillePlateau -TaillePlateau);
    }
     
    ...
    J'initialise la taille du plateau à 7.

    Résultat, quand j'initialise chaque case de mon tableau, rendu à partir de 43, il s'amuse à me changer mes valeurs à l'indice 1 du tableau en même temps

    i =42
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plateau[1]	0x00343c18 {Occupe=false IdentifiantJoueur=0 Coefficient=1.0000000000000000 ...}	Case *
    i=43
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plateau[1]	0x00343c18 {Occupe=true IdentifiantJoueur=0 Coefficient=1.0000000000000000 ...}	Case *
    i=44
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plateau[1]	0x00343c18 {Occupe=true IdentifiantJoueur=3443232 Coefficient=1.0000000000000000 ...}	Case *
    Ces valeurs barbares cassent le fonctionnement de mon programme de TP, et je ne comprends pas pourquoi cela se passe comme ça...

    Merci pour votre aide !

  2. #2
    Membre régulier Avatar de cynique
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Points : 72
    Points
    72
    Par défaut
    Tu dois changer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public:
    	Case *plateau[];
     
    ...
     
    	*plateau = new Case[TaillePlateau*TaillePlateau];
    en:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public:
    	Case *plateau; // pas de []
     
    ...
     
    	plateau = new Case[TaillePlateau*TaillePlateau];
    ou:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public:
    	std::vector<Case *> plateau;
     
    ...
     
    	plateau.resize(TaillePlateau*TaillePlateau);

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Ok merci, j'ai effectué les changements dans mon code, mais je ne vois pas comment adapter ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	plateau = new Case[TaillePlateau*TaillePlateau];
     
    	for(int i = 0; i < TaillePlateau*TaillePlateau; i++)
    		plateau[i] = new Case(false, VIDE, 1.0f, i);
    error C2679: '=' binaire*: aucun opérateur trouvé qui accepte un opérande de partie droite de type 'Case *' (ou il n'existe pas de conversion acceptable)
    Je ne peux pas affecter le Case que je veux à chaque index ?

    Merci

  4. #4
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Tu as dans Plateau, un tableau de pointeur vers des Cases.

    Donc la déclaration initiale doit être :

    Ensuite, ce que tu veux, c'est allouer pour plateau suffisamment de mémoire pour contenir l'ensemble de tes pointeurs vers des cases.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plateau = new Case*[TaillePlateau*TaillePlateau]
    Enfin, tu veux allouer une nouvelle case pour chacun des pointeurs de ton tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(int i = 0; i < TaillePlateau*TaillePlateau; i++)
    		plateau[i] = new Case(false, VIDE, 1.0f, i);
    Bien sûr, tu prendras soin de libérer tout ça correctement à la fin, en parcourant plateau et en faisant delete sur chacun de ses éléments, puis en faisant delete[] sur plateau.

    Cela dit, comme on te l'as fait remarquer, il y a beaucoup trop de pointeurs là dedans, tu te simplifierais la vie à utiliser std::vector ou std::fixed_array, par exemple .

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Ah ouais, tout de suite ça marche mieux avec un vector. Faut vraiment que je revoie ma copie en C++, apparemment la STL a plein de trucs sympas pour encapsuler ces $*%£ de pointeurs

    Merci

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

Discussions similaires

  1. [DOM] Java XML Struts et ecriture dans objet response
    Par Tanebisse dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 16/10/2009, 11h36
  2. Réponses: 8
    Dernier message: 09/02/2007, 15h31
  3. [LG]ecriture dans un fichier binaire
    Par jsaviola dans le forum Langage
    Réponses: 3
    Dernier message: 26/12/2003, 17h30
  4. TWebBrowser créé dans un objet.
    Par Speed41 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 03/11/2003, 10h34
  5. Réponses: 2
    Dernier message: 26/09/2003, 14h51

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