2012-05-03 4 views
1

私のファイルにSDL_MapRGBを使用しているときに特定の問題が発生しましたjeu.c私はビデオゲームを作ろうとしています。構造を使用してコード:SDL_MapRGBがエラーメッセージなしでクラッシュする

main.cの

#include <stdlib.h> 
#include <stdio.h> 
#include <SDL/SDL.h> 
#include <SDL_image.h> 
#include "constantes.h" 
#include "jeu.h" 
#include "editeur.h" 


int main(int argc, char *argv[]) 
{ 
        Partie *jeu = NULL; 
        jeu = (Partie *)malloc(sizeof(Partie)); 
        if (jeu ==NULL){ 
        fprintf(stderr,"Problème d'allocation de mémoire"); 
        return 1; 
        } 

SDL_Surface *ecran = NULL, *menu = NULL; 
SDL_Rect positionMenu; 
SDL_Event event; 

int continuer = 1; 

SDL_Init(SDL_INIT_VIDEO); 
if(SDL_Init(SDL_INIT_VIDEO)!=0) 
    { 
     fprintf(stderr,"probleme d'init video: %s\n", SDL_GetError()); 
    }; 
SDL_WM_SetIcon(IMG_Load("img/icone.png"), NULL); // L'icône doit être chargée avant SDL_SetVideoMode 
ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); 
printf("Mode vidéo: dx%d\n", ecran->w, ecran->h, ecran->format->BitsPerPixel); 
SDL_WM_SetCaption("pacman", NULL); 

menu = IMG_Load("img/menu.png"); 
positionMenu.x = 0; 
positionMenu.y = 0; 

while (continuer) 
{ 
    SDL_WaitEvent(&event); 
    switch(event.type) 
    { 
     case SDL_QUIT: 
      continuer = 0; 
      break; 
     case SDL_KEYDOWN: 
      switch(event.key.keysym.sym) 
      { 
       case SDLK_ESCAPE: 
        continuer = 0; 
        break; 
       case SDLK_RETURN: // 
        jouer (ecran); 
        break; 
       case SDLK_SPACE: // Demande à jouer 
        jouer (ecran); 
        break; 
        case SDLK_KP_ENTER: // Demande à jouer 
        jouer (ecran); 
        break; 
       case SDLK_KP1: // Demande à jouer 
        jouer (ecran); 
        break; 
       case SDLK_KP2: // Demande l'éditeur de niveaux 
        editeur(ecran); 
        break; 
      } 
      break; 
    } 
    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); 
    SDL_BlitSurface(menu, NULL, ecran, &positionMenu); 
    SDL_Flip(ecran); 
} 
SDL_FreeSurface(menu); 
SDL_Quit(); 
return EXIT_SUCCESS; 
} 

constantes.h

#ifndef DEF_CONSTANTES 
#define DEF_CONSTANTES 
#include <SDL/SDL.h> 
#include <SDL_image.h> 
#include <SDL_ttf.h> 
#define TAILLE_BLOC   25 
#define NB_BLOCS_LARGEUR 28 
#define NB_BLOCS_HAUTEUR 28 
#define LARGEUR_FENETRE  TAILLE_BLOC * NB_BLOCS_LARGEUR 
#define HAUTEUR_FENETRE  TAILLE_BLOC * NB_BLOCS_HAUTEUR 


enum {HAUT, BAS, GAUCHE, DROITE}; 
enum {VIDE, MUR, GRAINE, ENNEMI, BONUS, PACMAN}; 

struct partie 
{ 
SDL_Surface * ecran; 
int score; 
}; 
typedef struct partie Partie; 
#endif 

、ここでこの行がSDL_FillRectで起動した後

#include <stdlib.h> 
#include <stdio.h> 
#include <SDL/SDL.h> 
#include <SDL_image.h> 
#include <SDL_ttf.h> 
#include "constantes.h" 
#include "jeu.h" 

int jouer(Partie * jeu) 
{ 


SDL_Surface * ecran; 
SDL_FillRect(ecran, NULL, SDL_MapRGB(jeu->ecran->format, 0, 0, 0)); 

jeu.cを来る私はなぜ知らないが、何でも、私はプログラムを書いているがクラッシュしています。私はこれがnoobのコードを読み取ることは難しいですけど、私はすべての過ごし

SDL_Surface * ecran; 
Uint32 couleur=SDL_MapRGB(jeu->ecran->format, 0, 0, 0); 
SDL_FillRect(jeu->ecran, NULL, couleur); 

とプログラムがSDL_FILLRect

前に墜落した:私は、私はまた、代わりにこれを試して ... printf関数の多くを使用することによって、この問題を突き止めます解決策がないこの問題について私の一日。 はあなたがSDL_Surfaceに初期化されていないポインタにSDL_FillRect()を呼び出しているように見える

答えて

1

をお読みいただきありがとうございました - NULLか、無効であり、あなたのコードがすぐにクラッシュする(幸運の場合)または有効なメモリ位置を指すように起こっている(とプログラムのメモリを破壊することになります)。あなたが後でそれを使用する予定の方法に応じて

、いずれかのヒープ

SDL_Surface *ecran = malloc(sizeof(SDL_Surface)); 

か、単にスタック上に全部を入れて、それがSDL_FillRectへのアドレス(多分良いでしょう合格のあなたの表面のためのいくつかのメモリを割り当てますあなたがjouer機能の外でそれを使用する予定がない場合は、オプション

SDL_Surface ecran; 
SDL_FillRect(&ecran, ...) 
関連する問題