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

SDL Discussion :

SDL_init renvoie NULL !?


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 28
    Par défaut SDL_init renvoie NULL !?
    Bonsoir,

    voilà, je code un projet Mario avec deux amis sous visual C ++ 2005 et j'ai un problème avec l'initialisation de la SDL.
    Pour l'initialiser, je fais appel à SDL_Init(SDL_INIT_VIDEO) et visual me dit en pointant cette fonction :

    "Exception non gérée à 0x100144b8 dans Mario Project.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000000."


    Mais le problème c'est qu'il n'y a strictement rien avant...

    Voici le code du début du main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main(int argc, char *argv[])
    {
    	SDL_Surface* ecran = NULL;
     
    	// Chargement de la SDL
    	ecran = init_SDL(LARGEUR_FENETRE, HAUTEUR_FENETRE);
    (...)
    return 0;
    }
    et voici le code de l'initialisation de la SDL :

    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
    SDL_Surface *init_SDL(int x, int y)
    {
    	SDL_Surface* ecran;
    	char *erreur;
     
    	if(SDL_Init(SDL_INIT_VIDEO)){
    		erreur = SDL_GetError();
    		printf("%s\n",erreur);
                             exit(0);
    	}
     
    	ecran = SDL_SetVideoMode(x, y, 32, SDL_OPENGL);
    	if(ecran == -1){
    		printf(" ERROR SDL !!! \n");
    		exit(0);
    	}
    	SDL_EnableKeyRepeat(10, 10);
    	SDL_WM_SetCaption("=Mario Project= V0.020a", NULL);
    	SDL_ShowCursor(0);
     
    	return ecran;
    }
    Pourtant chez mes deux compères, ça marche mais chez moi ça ne marche qu'une fois sur dix...

    Merci d'avance pour votre aide

  2. #2
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	if(ecran == -1){
    		printf(" ERROR SDL !!! \n");
    		exit(0);
    	}
    Ce serait pas plutôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	if(ecran == NULL){
    		printf(" ERROR SDL !!! \n");
    		exit(0);
    	}
    Pour le reste, je ne suis pas sûr que l'erreur vienne d'ici spécifiquement, essaie de "logger" tes actions (par exemple: Initialisation Terminée, Appel à SDL_SetVideoMode réussi, ...) comme ça tu pourras voir plus précisément à quelle ligne l'erreur intervient !

    Sinon, le reste semble

  3. #3
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 28
    Par défaut
    Bonjour,

    déjà merci de m'avoir répondu
    Je viens de corriger la petite erreur qui s'était glissée dans le code, mais cela ne change rien

    En fait l'erreur se trouve à cette ligne-là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(SDL_Init(SDL_INIT_VIDEO))
    Le programme s'arrête donc ici en me disant que cette fonction renvoie NULL alors que normalement elle devrait me renvoyer un entier (0 si c'est bien initialisé et -1 sinon, si je me rappelle bien )

    Je ne vois pas toujours pas d'où ça peut venir et pourquoi cette fonction me renvoie NULL

  4. #4
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Ta fonction SDL_Init renvoie 0 (0 = NULL), il n'y a pas de problème à ça.

    Le problème est autrepart dans le code, ça veut dire que t'essaies d'accéder au contenu d'un pointeur qui a la valeur NULL (ou que tu passes un pointeur NULL à une fonction qui ne le gère pas).

    C'est pour ça que repérer où le programme plante peut être une bonne idée

  5. #5
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 28
    Par défaut
    Comme je l'ai montré plus haut, je n'ai rien mis d'autre, à part la déclaration d'un pointeur sur une SDL_Surface pour mon ecran afin d'initialiser la SDL.

    Comme c'est la fonction SDL_Init qui fait planter le programme, j'ai essayé de mettre des points d'arrêts mais je n'ai pas réussi à avoir des infos supplémentaires

    Sinon je peux montrer mon main en entier :
    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
    int main(int argc, char *argv[])
    {
    	SDL_Surface* ecran = NULL;
     
    	// Chargement de la SDL, de OpenGL et de FMOD 
    	ecran = init_SDL(LARGEUR_FENETRE, HAUTEUR_FENETRE);
    	init_OpenGL(LARGEUR_FENETRE, HAUTEUR_FENETRE);
    	FSOUND_Init(44100, 32, 0);
     
    	jouer();
     
     
    	// liberation de la memoire
    	FSOUND_Close();
    	SDL_FreeSurface(ecran);
    	SDL_Quit();
     
    	return 0;
    }


    Mais bon il n' y a strictement rien avant l'appel à SDL_Init qui pourrait le faire planter...

  6. #6
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    désolé, mais juste au cas où:

    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
    SDL_Surface *init_SDL(int x, int y)
    {
    	SDL_Surface* ecran;
    	char *erreur;
     
        printf("Appel a SDL_Init... ");
    	if(SDL_Init(SDL_INIT_VIDEO) != 0){
    		erreur = SDL_GetError();
    		printf("%s\n",erreur);
                             exit(0);
    	}
    	printf("réussi!\n");
     
    	ecran = SDL_SetVideoMode(x, y, 32, SDL_OPENGL);
    	if(ecran == NULL){
    		printf(" ERROR SDL !!! %s\n", SDL_GetError());
    		exit(0);
    	}
    	SDL_EnableKeyRepeat(10, 10);
    	SDL_WM_SetCaption("=Mario Project= V0.020a", NULL);
    	SDL_ShowCursor(0);
     
    	return ecran;
    }
     
    int main(int argc, char *argv[])
    {
        printf("Debut du main\n");
    	SDL_Surface* ecran = NULL;
     
    	// Chargement de la SDL, de OpenGL et de FMOD 
    	printf("Avant l'appel à init_SDL(%d, %d)\n", LARGEUR_FENETRE, HAUTEUR_FENETRE);
    	ecran = init_SDL(LARGEUR_FENETRE, HAUTEUR_FENETRE);
    	printf("Toute l'initialisation s'est déroulée correctement\n");
    	init_OpenGL(LARGEUR_FENETRE, HAUTEUR_FENETRE);
    	FSOUND_Init(44100, 32, 0);
     
    	// liberation de la memoire
    	FSOUND_Close();
    	SDL_FreeSurface(ecran);
    	SDL_Quit();
     
    	return 0;
    }
    Si il affiche "Appel a SDL_Init... " mais pas "Appel a SDL_Init... réussi!", alors c'est vraiment un bug incompréhensible, et peut-être qu'en réinstallant SDL...

  7. #7
    Membre éprouvé Avatar de Polyfructol
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Avril 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Avril 2007
    Messages : 131
    Par défaut
    Comme tu l'as toi même remarqué, SDL_Init renvoie -1 si il y a une erreur. Donc ta condition devrais plutôt être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (SDL_Init(SDL_INIT_VIDEO) == -1))
    Bien que "if (SDL_Init(SDL_INIT_VIDEO))" fonctionne aussi.

    Aussi, fait bien attention à ce que la résolution que tu passes grâce aux constantes LARGEUR_FENETRE et HAUTEUR_FENETRE soit bien valide (genre 800x600, 1024x768 etc...)

    Encore une chose, tu n'es pas obligé d'utiliser de variable "ecran" car la SDL possède la fonction SDL_GetVideoSurface() qui permet d'atteindre la surface video. (ça t'évitera le passage de pointeur avec ta fonction init_SDL)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_OPENGL);
     
        if (SDL_GetVideoSurface() == NULL)
        {
            printf("%s\n", SDL_GetError());
            return false; // On peut imaginer que la fonction init_SDL renvoie un booleén
        }
    Citation Envoyé par Shiva87
    Pourtant chez mes deux compères, ça marche mais chez moi ça ne marche qu'une fois sur dix...
    Ahh, les lois impénétrables de l'informatique

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

Discussions similaires

  1. Request.getParameter renvoie NULL
    Par the java lover dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 22/10/2006, 10h34
  2. [ppc] Malloc renvoie NULL !
    Par FamiDoo dans le forum C++
    Réponses: 4
    Dernier message: 18/08/2006, 10h01
  3. Operateur "new" renvoi NULL
    Par Demerzel_01 dans le forum C++
    Réponses: 25
    Dernier message: 07/07/2006, 09h43
  4. [SPL] Rewind() qui renvoie NULL
    Par fadeninev dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 06/06/2006, 15h44
  5. [JDBC]Un new qui renvoie null...
    Par Ditch dans le forum JDBC
    Réponses: 4
    Dernier message: 03/01/2005, 13h14

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