Problème destructeur C++
Résolu
Lumz
-
Lumz -
Lumz -
Bonjour,
Je réalise un petit jeu de belote en C++.
J'ai plutôt l'habitude du C donc j'ai peut être (suremment) raté un truc.
Le programme compile sans problème. (Pas de warning bizzares).
Mais plante lorsque je tente de quitter le progamme.
Plus exactement après debugage, c'est à la sortie du destructeur ~Game() que je reçoit une erreur de segmentation.
Si quelqu'un a une suggestion, c'est avec plaisir.
Merci
Note : J'utilise la SDL et pas de problème de ce coté là.
Je réalise un petit jeu de belote en C++.
J'ai plutôt l'habitude du C donc j'ai peut être (suremment) raté un truc.
Le programme compile sans problème. (Pas de warning bizzares).
Mais plante lorsque je tente de quitter le progamme.
Plus exactement après debugage, c'est à la sortie du destructeur ~Game() que je reçoit une erreur de segmentation.
Si quelqu'un a une suggestion, c'est avec plaisir.
Merci
Note : J'utilise la SDL et pas de problème de ce coté là.
/* * main.cpp */ #include <iostream> #include <stdlib.h> #include <SDL.h> #include "Game.h" #include "const.h" using namespace std; int main(int argc, char** argv) { //Initialisation if(SDL_Init(SDL_INIT_VIDEO) < 0){ cout << "Unable to init SDL: " << SDL_GetError() << endl; return EXIT_FAILURE; } //Nouvelle fenêtre SDL_Surface* screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32, SDL_HWSURFACE|SDL_DOUBLEBUF); if (screen == NULL){ cout << "Unable to set 500x430 video: " << SDL_GetError() << endl; return EXIT_FAILURE; } //Chargement des sprites SDL_Surface* sprites[SPRITES_COUNT]; unsigned int i; for(i = 0; i < SPRITES_COUNT; i++){ sprites[i] = NULL; } sprites[BG] = SDL_LoadBMP("gfx/bg.bmp"); sprites[CARDS] = SDL_LoadBMP("gfx/cards.bmp"); for(i = 0; i < SPRITES_COUNT; i++){ if(sprites[i] == NULL){ cout << "Unable to load graphics : " << SDL_GetError() << endl; } } //Jeu Game* current_game = new Game(); bool done = false; while(!done){ //Gestion des events SDL_Event event; while (SDL_PollEvent(&event)){ switch (event.type){ case SDL_QUIT: done = true; break; } } //Effacer SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0)); //Blit current_game->draw(screen, sprites); //MAJ de l'écran SDL_Flip(screen); } //Free delete current_game; SDL_Quit(); return EXIT_SUCCESS; } /** * Game.h */ #ifndef GAME_H_INCLUDED #define GAME_H_INCLUDED #include "Card.h" //#include "Round.h" #include "const.h" class Game{ private : unsigned int scores[2]; //Scores unsigned short int dealer; //Donneur Card* deck[32]; //Paquet //Round* current_round; //Manche public : Game(); ~Game(); /* * Jeu */ //Marquer des points void add_score(team t, unsigned int s); //Couper le jeu //void cut(); //Nouvelle manche //void new_round(unsigned short int dealer, Card* deck[32]); //Vérifier si une équipe est victorieuse bool victory(team t); /* * Dessin */ void draw(SDL_Surface* s, SDL_Surface* spr[SPRITES_COUNT]); }; #endif // GAME_H_INCLUDED /* * Game.cpp */ #include <iostream> #include <SDL.h> #include <stdlib.h> #include <time.h> //#include "Card.h" #include "Game.h" //#include "Round.h" #include "const.h" //Constructeur Game::Game(){ this->scores[NS] = 0; this->scores[EW] = 0; //Premier donneur srand(time(NULL)); this->dealer = (unsigned short int)rand()%4; //Initialisation du jeu unsigned short int i,j; for(i = 0; i < 4; i++){ for(j = 7; j < 7+8; j++){ this->deck[i*8+j] = new Card(i,j); } } //Mélange for(i = 0; i < 100; i++){ unsigned short int c_1,c_2; c_1 = rand()%32; c_2 = rand()%32; Card* tmp_c = this->deck[c_1]; this->deck[c_1] = this->deck[c_2]; this->deck[c_2] = tmp_c; } //Nouvelle manche //this->new_round(this->dealer, this->deck); } //Destructeur Game::~Game(){ //deck unsigned short int i; for(i = 0; i < 32; i++){ delete this->deck[i]; } //current_round //delete current_round; } /* * Jeu */ //Marquer des points void Game::add_score(team t, unsigned int s){ this->scores[t] += s; } //Couper le jeu /* void Game::cut(){ Card* tmp_deck[32]; srand(time(NULL)); unsigned short int i,j,cut_i; j = 0; cut_i = rand()%32; for(i = cut_i; i < 32; i++){ tmp_deck[j++] = this->deck[i]; } for(i = 0; i < cut_i; i++){ tmp_deck[j++] = this->deck[i]; } } //Nouvelle manche void Game::new_round(unsigned short int dealer, Card* deck[32]){ this->cut(); if(this->current_round != NULL){ delete this->current_round; } this->current_round = new Round(dealer,deck); this->dealer = (this->dealer+1)%4; } */ //Victoire? bool Game::victory(team t){ if(this->scores[t] >= MAX_SCORE){ return true; } else{ return false; } } /* * Dessin */ void Game::draw(SDL_Surface* s, SDL_Surface* spr[SPRITES_COUNT]){ SDL_Rect src,des; //Le tapis src.x = 0; src.y = 0; src.w = SCREEN_WIDTH; src.h = SCREEN_HEIGHT; des.x = 0; des.y = 0; des.w = SCREEN_WIDTH; des.h = SCREEN_HEIGHT; SDL_BlitSurface(spr[BG],&src,s,&des); }
A voir également:
- Problème destructeur C++
- Destructeur d odeur maison - Guide
2 réponses
Bonjour,
Je n'ai pas le temps, ni l'envie de lire tout ton code,
Mais ceci m'intrigue ;
//Initialisation du jeu
unsigned short int i,j;
for(i = 0; i < 4; i++){
for(j = 7; j < 7+8; j++){
this->deck[i*8+j] = new Card(i,j);
}
}
Tu commence a créer ta carte à partir de la 7ème (de 7 à 38) !
Et ton tableau deck est défini sur 32 !!
Donc à partir du 32ème, il va écrire un peu n'importe où dans la mémoire ;
Et après, va savoir ce que fait ton delete dans le destructeur..
Tu voulais le faire de 0 à 31, non ?
Il faut donc revoir ta boucle.
Cordialement, M.
Je n'ai pas le temps, ni l'envie de lire tout ton code,
Mais ceci m'intrigue ;
//Initialisation du jeu
unsigned short int i,j;
for(i = 0; i < 4; i++){
for(j = 7; j < 7+8; j++){
this->deck[i*8+j] = new Card(i,j);
}
}
Tu commence a créer ta carte à partir de la 7ème (de 7 à 38) !
Et ton tableau deck est défini sur 32 !!
Donc à partir du 32ème, il va écrire un peu n'importe où dans la mémoire ;
Et après, va savoir ce que fait ton delete dans le destructeur..
Tu voulais le faire de 0 à 31, non ?
Il faut donc revoir ta boucle.
Cordialement, M.