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 :

pointeurs: segmentation fault incompréhensible


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 64
    Points : 43
    Points
    43
    Par défaut pointeurs: segmentation fault incompréhensible
    Bonjour,

    Dans un programme que je réalise j'utilise une propriété des pointeurs.
    Je m'explique : dans mon main je déclare un pointeur sur une strucutre de type
    SDL_Surface :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SDL_Surface *Planisphere;
    Ensuite j'appel une fonction nommée LoadPlanisphere() en mettant comme argument ce pointeur de structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    id = LoadPlanisphere(CHEMIN,Planisphere);
    qui prend comme argument un chemin et un pointeur sur une struture de type SDL_Surface, voici la fonction :

    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
     
    GLuint LoadPlanisphere(char *image_path, SDL_Surface *planisphere) {
     
    	GLuint gl_id;
     
    	Uint32 rmask, gmask, bmask, amask;
     
    	if((planisphere = IMG_Load(image_path)) == NULL)
    		return -1;
     
    	/* change l'ordre des bytes, reellement utile que si on charge du bitmap */
    	#if SDL_BYTEORDER == SDL_BIG_ENDIAN
        		rmask = 0xff000000;
        		gmask = 0x00ff0000;
        		bmask = 0x0000ff00;
        		amask = 0x000000ff;
    	#else
        		rmask = 0x000000ff;
        		gmask = 0x0000ff00;
        		bmask = 0x00ff0000;
    		amask = 0xff000000;
    	#endif
     
    	SDL_PixelFormat format = *(planisphere->format);
        	format.BitsPerPixel = SCREEN_DEPTH;
        	format.BytesPerPixel = 4;
        	format.Rmask = rmask;
        	format.Gmask = gmask;
        	format.Bmask = bmask;
        	format.Amask = amask;
     
    	planisphere = SDL_ConvertSurface(planisphere, &format, SDL_SWSURFACE);
     
    	glGenTextures(1, &gl_id);
     
            glEnable(GL_TEXTURE_2D);
     
            glBindTexture(GL_TEXTURE_2D, gl_id);
     
            glTexImage2D(GL_TEXTURE_2D, 0, 4, planisphere->w, planisphere->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, planisphere->pixels);
     
    	// ci dessous : fonctionne correctement !
    	// fprintf(stderr, "planisphere->w : %d, planisphere->h : %d", planisphere->w, planisphere->h);
     
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     
    	glDisable(GL_TEXTURE_2D);
     
       	return gl_id;
    }
    mais après cela je ne peux pas utiliser les valeurs Planisphere->w et Planisphere->h du pointeur de struture de mon main sans faire un segfault !

    dans la fonction LoadPlanisphere() tout va bien les valeurs
    planisphere->w et planisphere->h sont bien attribuées mais lorsque
    j'utilise les valeurs Planisphere->w et Planisphere->h dans mon main j'ai un segfault je ne comprend absolument pas....

    J'ai pourtant fait un passage par adresse bien classique, je devrais pouvoir exploirter ces données par la suite dans mon main ...

    est-ce que vous avez une idée ?


    merci,
    -------------------

    @(zmodai)+

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour

    Tu passes bien planisphère par pointeur, mais cela ne suffit pas :

    Cela ne suffit pas car tu ne fait pas que modifier planisphere dans ta fonction, tu le crées aussi.

    Le plus simple à ce stade est de modifier légèrement le prototype :

    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
    SDL_Surface *planisphere;
    LoadPlanisphere(filename, &planisphere);
    /*...*/
    GLuint LoadPlanisphere(char *image_path, SDL_Surface **planisphere) {
     
    	GLuint gl_id;
     
    	Uint32 rmask, gmask, bmask, amask;
     
    	if((*planisphere = IMG_Load(image_path)) == NULL)
    		return -1;
     
    	/* ... */
    	SDL_PixelFormat format = *((*planisphere)->format);
    	/* ... */
    	planisphere = SDL_ConvertSurface(*planisphere, &format, SDL_SWSURFACE);
     
    	/* ... */
     
            glTexImage2D(GL_TEXTURE_2D, 0, 4, (*planisphere)->w, (*planisphere)->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, (*planisphere)->pixels);
     
    	/* ... */
       	return gl_id;
    }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 64
    Points : 43
    Points
    43
    Par défaut
    Merci pour la réponse !

    J'ai finalement décidé de repartir un bout du code de cette fonction dans une autre et d'utiliser une variable static.
    -------------------

    @(zmodai)+

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

Discussions similaires

  1. segmentation.fault pointeur ->de.*m.
    Par PhilippeHen dans le forum Débuter
    Réponses: 5
    Dernier message: 05/08/2009, 16h51
  2. Segmentation fault incompréhensible
    Par BestFF dans le forum C++
    Réponses: 6
    Dernier message: 08/01/2009, 22h27
  3. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/09/2004, 06h05
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

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