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 :

Probablement problème de pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Par défaut Probablement problème de pointeurs
    Bonjour,
    Je fait actuellement un flying shark (shooter avec avion traditionnel) pour en projet en rapport avec mes cours, néanmoins étant débutant je rencontre pas mal d'obstacles.

    J'ai réussi à se faire déplacer une image sur le fond, qui change en fonction de l'orientation de l'avion. Ensuite j'ai réussi à sortir la partie qui s'occupe du mouvement du main (non sans mal ).

    Sauf que maintenant que j'essaie de faire une boucle dans mon fichier "jeu" qui me permettra d’enchaîner les actions (pour commencer; bouger, puis afficher) c'est la catastrophe.

    La partie qui me permet de sortir du jeu en appuyant sur escape ou une touche ne marche plus, l'avion bouge uniquement d'un pixel avant de revenir à sa position initiale.

    Voici le code, j'ai essayé de le rendre le plus lisible possible ;


    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL_image.h>
    #include "jeu.h"
     
    enum {NORMAL,GAUCHE,DROITE};
     
    void jeu()
    {
     
        SDL_Surface *ecran = NULL,*planemtn = NULL;
        SDL_Surface *plane[3] = {NULL}; // pour stocker les 3 images pour les 3 positions
        int i=0;
     
        SDL_Rect position;
        position.x = 100;       //valeurs test
        position.y = 100;
     
     
        SDL_Init(SDL_INIT_VIDEO);
     
        ecran = SDL_SetVideoMode(480, 640, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); //  | SDL_NOFRAME (pour virer les bordures)
        SDL_WM_SetCaption("Flying Shark", NULL);  // si on ne vire pas les bordures
     
        plane[NORMAL] = IMG_Load("jeanpaul.png");
        plane[GAUCHE] = IMG_Load("jeanpaulgauche.png");
        plane[DROITE] = IMG_Load("jeanpauldroite.png");
        planemtn = plane[NORMAL];
     
        int continuer = 1;
     
        while (continuer)
        {
        deplacement(continuer,plane,planemtn,ecran,position);
        //affich(planemtn,ecran,tir,position);
        }
       // pause(); // a virer quand on aura fini
     
     
        SDL_FreeSurface(planemtn);//retourne une erreur 3, voir
        for (i = 0 ; i < 4 ; i++)
        {
            SDL_FreeSurface(plane[i]);
        }
     
        SDL_Quit();
    }
     
     
    void deplacement(int continuer, SDL_Surface *plane[3], SDL_Surface *planemtn, SDL_Surface *ecran, SDL_Rect position)
    {
        SDL_EnableKeyRepeat(10, 10);
        SDL_Event event;
     
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                continuer=0;
                break;
     
                case SDL_KEYDOWN:
                switch (event.key.keysym.sym)
                {
                    case SDLK_UP: // touche haut
                    position.y=position.y-2;
                    break;
     
                    case SDLK_DOWN: // touche bas
                    position.y=position.y+2;
                    break;
     
                    case SDLK_RIGHT: // touche droite
                    position.x=position.x+2;
                    planemtn = plane[DROITE];
                    break;
     
                    case SDLK_LEFT: // touche gauche
                    position.x=position.x-2;
                    planemtn = plane[GAUCHE];
                    break;
     
                      //  case SDLK_SPACE: // tir, probablement à déplacer
                      //  tirer (tir,ecran,position);
                      //  break;
     
                    default:        // pour le moment quitte si touche non correcte, changer pour ne rien faire
                    continuer=0;
                    break;
                }
                break;
            }
     
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
        SDL_BlitSurface(planemtn, NULL, ecran, &position);
        SDL_Flip(ecran);
     
     
        SDL_EnableKeyRepeat(0, 0);
    }
    Vu que la position ne se met plus à jour et se réinitialise à chaque tour de boucle, et que le changement de la variable "continuer" ne s'effectue pas (même quand j'ai essayé de la passer en pointeur), je suppose que c'est un problème de pointeur.

    Ayant commencé le C il y 2 mois je suis probablement passé à coté d'une grosse erreur mais je ne la trouve pas, si quelqu'un peux m'aider j'en serais extrêmement reconnaissant.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Bonjour,

    Déjà, il y a le problème de continuer que tu devrais passer en pointeur en effet:

    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
    void deplacement(int *pContinuer, SDL_Surface *plane[3], SDL_Surface *planemtn, SDL_Surface *ecran, SDL_Rect position)
    {
    	int continuer = *pContinuer;
     
    	...
     
    	*pContinuer = continuer;
    }
     
    void jeu()
    {
     
    	...
    	deplacement(&continuer,plane,planemtn,ecran,position);
    	...
     
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Edit: Ensuite, tu ne dois pass appeler SDL_FreeSurface() sur planemtn, car il ne possède pas l'image sur laquelle il pointe: Elle appartient au tableau plane, que tu libéres séparément.

    Enfin, tu dois faire le même traitement sur planemtn et position, vu que ta fonction modifie le pointeur et les members de la structure:
    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
    void deplacement(int *pContinuer, SDL_Surface * const plane[], SDL_Surface **pPlanemtn, SDL_Surface *ecran, SDL_Rect *pPosition)
    {
    	int continuer = *pContinuer;
    	SDL_Surface *planemtn = *pPlanemtn;
     
    	...
    	pPosition->x = ...
    	...
     
    	*pContinuer = continuer;
    	*pPlanemtn = planemtn;
    }
     
    void jeu()
    {
     
    	...
    	deplacement(&continuer, plane, &planemtn, ecran, &position);
    	...
     
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Edit: Ensuite, tu ne dois pass appeler SDL_FreeSurface() sur planemtn, car il ne possède pas l'image sur laquelle il pointe: Elle appartient au tableau plane, que tu libéres séparément.

    Enfin, tu dois faire le même traitement sur planemtn et position, vu que ta fonction modifie le pointeur et les members de la structure:
    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
    void deplacement(int *pContinuer, SDL_Surface * const plane[], SDL_Surface **pPlanemtn, SDL_Surface *ecran, SDL_Rect *pPosition)
    {
    	int continuer = *pContinuer;
    	SDL_Surface *planemtn = *pPlanemtn;
     
    	...
    	pPosition->x = ...
    	...
     
    	*pContinuer = continuer;
    	*pPlanemtn = planemtn;
    }
     
    void jeu()
    {
     
    	...
    	deplacement(&continuer, plane, &planemtn, ecran, &position);
    	...
     
    }
    Merci beaucoup, en effet cela marche mieux et merci pour l'explication du Free_Surface planemtn en effet c'est logique.

    J'ai quelques petites questions si cela ne te déranges pas;
    Pourquoi le "SDL_Surface * const plane[]" à la place de ce que j'avais mis dans le titre de la fonction?

    Le "*P" devant les élément crée-t'il une nouvelle variable ou bien l'IDE "sait" que c'est une variante dudit élément? Ca me semble un peu stupide comme question vu que le bon sens voudrait que dés qu'on change une lettre c'est un élément différent mais jusqu'ici j'ai l'habitude de déclarer les variables à part.

    Ensuite dans ma boucle dans la fonction "jeu" j'ai incorporé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    while (continuer)
        {
        planemtn = plane[NORMAL];
        SDL_BlitSurface(planemtn, NULL, ecran, &position);
     
        deplacement(&continuer, plane, &planemtn, ecran, &position);
     
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
        SDL_BlitSurface(planemtn, NULL, ecran, &position);
        SDL_Flip(ecran);
        //affich(planemtn,ecran,tir,position);
        }
    pour que l'avion revienne à la position "standard" à la fin de son mouvement.

    Je souhaite l'incorporer dans la fonction "déplacement" mais du coup je ne sais pas trop comment le faire avec sans le "position" standard.

    Edit : Et si c'est bien des nouveaux pointeurs pas besoin de les free quelque part?

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Citation Envoyé par adn34 Voir le message
    Pourquoi le "SDL_Surface * const plane[]" à la place de ce que j'avais mis dans le titre de la fonction?
    • const parce qu'on ne modifie pas le contenu du tableau (les trois pointeurs), donc autant ne pas se l'autoriser (programmation défensive).
    • [] pour deux raisons:
      • Pour garder à l'esprit que le compilo se moque plus ou moins de la longueur qu'on met ici
      • Pour garder à l'esprit que le tableau n'est pas vraiment copié: Seul un pointeur vers le premier élément a été transmis (c'est un "gotcha" connu tu C).


    Le "*P" devant les élément crée-t'il une nouvelle variable ou bien l'IDE "sait" que c'est une variante dudit élément? Ca me semble un peu stupide comme question vu que le bon sens voudrait que dés qu'on change une lettre c'est un élément différent mais jusqu'ici j'ai l'habitude de déclarer les variables à part.
    Deux variables déclarées dans deux fonctions différentes sont toujours deux variables différentes, qu'elles aient le même nom ou pas.
    C'est pour le programmeur que je rajoute un p, pour qu'il soit évident au premier coup d’œil qu'on manipule ici un pointeur et non pas une copie de la variable (voir "notation hongroise").

    Ensuite dans ma boucle dans la fonction "jeu" j'ai incorporé ceci :
    (snip) pour que l'avion revienne à la position "standard" à la fin de son mouvement.

    Je souhaite l'incorporer dans la fonction "déplacement" mais du coup je ne sais pas trop comment le faire avec sans le "position" standard.
    La fonction prend déjà un pointeur de position, il suffit donc de lui passer pPosition tel quel.

    Edit : Et si c'est bien des nouveaux pointeurs pas besoin de les free quelque part?
    Ces pointeurs pointent tous vers des éléments qui ne leurs "appartiennent" pas; il n'y a pas eu de malloc() (ou équivalent), donc pas de free() (ou équivalent).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Par défaut
    Merci d'avoir pris le temps de répondre, c'est plus clair maintenant et je vais pouvoir avancer.
    Encore merci.

  7. #7
    Membre éclairé Avatar de aslo92
    Homme Profil pro
    Ingénieur développement logiciels temps réel
    Inscrit en
    Février 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels temps réel
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 43
    Par défaut
    Bonjour adn34,

    Je confirme ce que dit Médinoc.
    En plus j'ajouterai que dans le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        for (i = 0 ; i < 4 ; i++)
        {
            SDL_FreeSurface(plane[i]);
        }
    tu fais comme si tu avais 4 avions alors que tu n'en a défini que 3.
    Pour que ton code ne plante pas il faut écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        for (i = 0 ; i < 3 ; i++)
        {
            SDL_FreeSurface(plane[i]);
        }

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Par défaut
    Citation Envoyé par aslo92 Voir le message
    Bonjour adn34,

    Je confirme ce que dit Médinoc.
    En plus j'ajouterai que dans le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        for (i = 0 ; i < 4 ; i++)
        {
            SDL_FreeSurface(plane[i]);
        }
    tu fais comme si tu avais 4 avions alors que tu n'en a défini que 3.
    Pour que ton code ne plante pas il faut écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        for (i = 0 ; i < 3 ; i++)
        {
            SDL_FreeSurface(plane[i]);
        }
    En effet je sais pas pourquoi je suis passé à coté oO, ça m'élimine une erreur type 3 au niveau de la console à la fin du programme, merci beaucoup!

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

Discussions similaires

  1. Problème de pointeurs..embrouillé
    Par Frenchy dans le forum C++
    Réponses: 11
    Dernier message: 10/03/2005, 16h33
  2. Problème de pointeur avec un TQuery
    Par Oluha dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/01/2005, 13h57
  3. Problème de pointeur
    Par toma_lille dans le forum C++
    Réponses: 1
    Dernier message: 07/12/2004, 21h26
  4. [MFC] Problème de pointeur !!
    Par acastor dans le forum MFC
    Réponses: 7
    Dernier message: 19/03/2004, 15h50
  5. TBitmap et problèmes de pointeurs...
    Par benj63 dans le forum C++Builder
    Réponses: 8
    Dernier message: 28/07/2003, 13h39

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