Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de portée variables/pointeurs

    11 juin 2006 à 12:35:39

    Bonjour tout le monde,

    je commence la programmation avec SDL et j'aimerais tout simplement faire une fonction qui dessine un pixel (et non des rectangles comme dans le cours).
    Donc je fait appel à une fonction dessine pixel à partir de la fonction main, seulement voilà cette fonction dessine pixel à besoin de connaitre la surface SDL sur laquelle elle doit faire son pixel. Mais je n'ai pas envie pour autant de transmettre à chaque appel le pointeur *écran à cette fonction (sur le tutorial qui me sert ils arrivent à s'en passer avec la fonction

    void putpixel(int x, int y, int color)
    {
      unsigned int *ptr = (unsigned int*)screen->pixels;
      int lineoffset = y * (screen->pitch / 4);
      ptr[lineoffset + x] = color;
    }

    donc j'ai essayé de faire pareil, voilà mon main :

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include "dessin.h"

    int main(int argc, char *argv[]){
            //INITIALISATION :
            SDL_Surface *ecran=NULL;       
            SDL_Event event;
            int continuer=1;
            int xo,yo;
            xo=1;
            yo=1;
            SDL_Init(SDL_INIT_VIDEO);//démarrage de la SDL
            ecran=SDL_SetVideoMode(800,600,32,SDL_HWSURFACE |SDL_DOUBLEBUF);
            SDL_WM_SetCaption("Pathfinder",NULL);
            //DESSIN INITIAL
            SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,255,255,255));
            //dessinepixel(xo,yo,0x000000);
            SDL_Flip(ecran);
            //GESTION DES EVENEMENTS :
            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;

                                    }
                    }
            }
            SDL_Quit();
            return EXIT_SUCCESS;
    }

    et voilà ma fonction

    void dessinepixel(int x, int y, int color)
    {
      unsigned int *ptr = (unsigned int*)ecran->pixels;
      int lineoffset = y * (ecran->pitch / 4);
      ptr[lineoffset + x] = color;
    }

    et donc l'erreur que me renvoie le compilateur est :

    Citation : Build

    error C2065: 'ecran' : undeclared identifier

    ce qui me parait normal puisqu'au moment ou il lit la fonction ecran n'est pas définit, mais j'ai besoin de déclarer cette fonction dans un autre fichier que main pour la clarté et j'aimerais que le compilateur soit conscient de l'existence de ecran au moment ou il lit le code de dessinepixel, comme par exemple un prototype pour écran :-° ou plutot un moyen de lui dire de lire le code de dessinepixel uniquement apres celui de main car de toute maniere il a le prototype de dessinepixel avant de lire main...
    voilà, merci de m'aider à sortir de ce problème, un peu tordu certes, d'ordre de déclarations et bonne journée :)
    • Partager sur Facebook
    • Partager sur Twitter
      11 juin 2006 à 12:43:21

      Salut :)

      Ca c'est un problème de débutant, bien avant la SDL t'aurais dû t'en rendre compte.

      Tu as trois moyens de passer une objet (variable, pointeurs, pointeur de structure...) :
      * Tu mets tes objets dans une structure, et tu fais passer ta structure en argument, plus de problème comme ça (mais attention: il faut faire une fonction qui initialise les objets car tu ne peux pas le faire à l'intérieur d'une structure).
      * Tu les passes en arguments. :p
      * Ou soit la méthode du crado : une variable globale (comme dans ton cours), je recommande les variables globales pour les tests, après, ça devient du code très dur à maintenir dès qu'il dépasse les 200 lignes.

      Kr00pS
      • Partager sur Facebook
      • Partager sur Twitter
        11 juin 2006 à 12:57:53

        mais justement je veux éviter de les envoyer en arguments pour pas allourdir mes déclarations de fonctions, j'aimerais le faire comme dans le tutorial, en placant dessinepixel de tellle manière qu'elle connaisse le pointeur *ecran...selon le tutorial ça marche mais je commence à me poser des questions, ils disent eux qu'il faut déclarer dessinerpixel après le moment ou on a déclaré écran...mais même en le déclarant dans le même fichier que main je vois pas comment la fonction tracepixel pourrait savoir ce que vaut ecran sauf si celui-ci est déclaré en global (ce que je ne veux pas faire)...alors je reformule ma question :
        Est-il possible de placer (placer dans le sens ordre de lecture par le compilateur) tracepixel judicieusement pour que le *ecran qui est utilisé dans son corps soit reconnu sachant qu'il a été déclaré dans une autre fonction auparavant comme pointeur ?
        Si la réponse est non ça m'étonne quand même qu'ils aient mis ça dans leur tutorial, et dans ce cas je devrais tout passer en argument (en plus c'est moche comme prototype
        void dessinepixel(SDL_Surface* ecran,int x, int y, int color);
        ).
        Et si la réponse est oui, comment ? :)
        • Partager sur Facebook
        • Partager sur Twitter
          11 juin 2006 à 12:59:03

          Bah prend la première solution que je t'ai proposé.
          • Partager sur Facebook
          • Partager sur Twitter
            11 juin 2006 à 14:34:44

            Sinon, tu as un autre moyen pour avoir accès directement à la surface principale (la fenêtre) : c'est la fonction SDL_GetVideoSurface(), qui te renvoit un pointeur sur ta surface d'affichage courante (SDL_GetVideoSurface -- returns a pointer to the current display surface).
            Et comme c'est utilisable partout, tu peux la remplacer dans toutes tes fonctions. (C'est à croire que je suis le seul à avoir lu la news décrivant certaines des nouvelles fonctionnalités de SDL !).

            Voila, bon courage.
            • Partager sur Facebook
            • Partager sur Twitter
              11 juin 2006 à 15:32:31

              ah ça me parait bien SDL_GetVideoSurface(); le problème est que quand j'appelle ma fonction dessinepixel, il a pas chargé les header de la SDL car il me met

              Citation : Buid


              error C2065: 'SDL_Surface' : undeclared identifier


              pourtant j'ai fait les include dans le bon ordre dans mon main.c, il faut que je remette les mêmes includes en haut de mon dessin.c qui contient le code de dessinepixel ?? j'ai vraiment du mal avec la programmation modulaire, commment lui dire clairement de charger la SDL avant d'interpréter les fichiers source ?
              • Partager sur Facebook
              • Partager sur Twitter

              Problème de portée variables/pointeurs

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown