SDL2 Les pointeurs

Résolu
poparnassus Messages postés 462 Statut Membre -  
poparnassus Messages postés 462 Statut Membre -
Bonjour,

Bon je galere grave avec c'est pointeur, franchement j'aimerai bien que quelqun m'explique pourquoi ca marche pas.

j'ai tout le temps ce warning.
warning: unused variable 'rectangleB' [-Wunused-variable]|

ma structure: fonction.h

//Pointeur
SDL_Window *screen;
SDL_Renderer *renderer;

//Structure qui gere l'affichage des images.
typedef struct Affichage Affichage;
struct Affichage
{
    //Fenetre
    int WIDTH, HEIGHT;
    int rax ;
    int ray ;
    int raw;
    int rah ;
    SDL_Texture *ArrierePlan;

    SDL_Rect *rectangle1;
    SDL_Rect *rectangleA;
    SDL_Rect *rectangleB;
    SDL_Rect *rectangleX;
    SDL_Rect *rectangleY;
};



ma fonction ; fonction.c

void ArrierePlan(char *titre,Affichage *affichage)
{
    affichage->ArrierePlan = NULL;
    //affichage->Texture = NULL;

    //Creation de la fenetre
    screen = SDL_CreateWindow(titre,SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,WINDOW_W,WINDOW_H,SDL_WINDOW_SHOWN);
    //Creation du renderer
    renderer = SDL_CreateRenderer(screen,-1,SDL_RENDERER_ACCELERATED);

     if (screen == NULL || renderer == NULL)
    {
        printf("Impossible d'initialiser le mode ecran %s ,\n", SDL_GetError());
    }

    SDL_SetRenderDrawColor(renderer, 255, 0, 0, 0);
    SDL_RenderClear(renderer);

    //chargement de l'image de fond
    //affichage->ArrierePlan = SDL_LoadBMP("6wd.bmp");

    //SDL_CreateTextureFromSurface(renderer, affichage->ArrierePlan);

     int r1w =WINDOW_W  , r1h = WINDOW_H/4;

    SDL_Rect *rectangle1 ;
    affichage->rectangle1->x = 20;
    affichage->rectangle1->y = 20;
    affichage->rectangle1->w = r1w - (rectangle1->x*2);
    affichage->rectangle1->h = r1h - (rectangle1->y*2);
    SDL_SetRenderDrawColor(renderer,255,255,255,255); // blanc
    SDL_RenderFillRect(renderer, affichage->rectangle1);

    affichage->rax = (rectangle1->x)+((rectangle1->w/2)-(((rectangle1->h) - (rectangle1->x))/2)),
    affichage->ray = (rectangle1->y)+((rectangle1->h /2)-(((rectangle1->h) - (rectangle1->x)) /2)),
    affichage->raw = rectangle1->h-rectangle1->x,
    affichage->rah = rectangle1->h-rectangle1->x;

    SDL_Rect *rectangleA ;
    affichage->rectangleA->x = affichage->rax;
    affichage->rectangleA->y = affichage->ray;
    affichage->rectangleA->w = affichage->raw/2;
    affichage->rectangleA->h =affichage->rah /2;
    SDL_SetRenderDrawColor(renderer,0,255,64,0); //VERT
    SDL_RenderFillRect(renderer, affichage->rectangleA);

    SDL_Rect *rectangleB ;
    affichage->rectangleB->x = affichage->rax + (affichage->raw/2);
    affichage->rectangleB->y = affichage->ray;
    affichage->rectangleB->w = affichage->raw/2;
    affichage->rectangleB->h =affichage->rah /2;
    SDL_SetRenderDrawColor(renderer,255,128,128,0);
    SDL_RenderFillRect(renderer, affichage->rectangleB);

    SDL_Rect *rectangleY ;
    affichage->rectangleY->x = affichage->rax ;
    affichage->rectangleY->y = affichage->ray+ (affichage->raw/2);
    affichage->rectangleY->w = affichage->raw/2;
    affichage->rectangleY->h =affichage->rah /2;
    SDL_SetRenderDrawColor(renderer,255,128,0,0); //ORANGE
    SDL_RenderFillRect(renderer, affichage->rectangleY);

    SDL_Rect *rectangleX ;
    affichage->rectangleX->x = affichage->rax + (affichage->raw/2);
    affichage->rectangleX->y = affichage->ray+ (affichage->raw/2);
    affichage->rectangleX->w = affichage->raw/2;
    affichage->rectangleX->h =affichage->rah /2;
    SDL_SetRenderDrawColor(renderer,0,0,255,0); //BLEU
    SDL_RenderFillRect(renderer, affichage->rectangleX);

    SDL_RenderPresent(renderer);


Quand je n'utilise pas les pointeur, ca marche j'ai mes coulours et carrés qui se dessine, comme ca:

SDL_Rect *rectangle1 ;
    affichage->rectangle1->x = 20;
    rectangle1.y = 20;
    rectangle1.w = r1w - (rectangle1.x*2);
    rectangle1.h = r1h - (rectangle1.y*2);
    SDL_SetRenderDrawColor(renderer,255,255,255,255); // blanc
    SDL_RenderFillRect(renderer, &rectangle1);

    int rax = (rectangle1.x)+((rectangle1.w/2)-(((rectangle1.h) - (rectangle1.x))/2)),
    ray = (rectangle1.y)+((rectangle1.h /2)-(((rectangle1.h) - (rectangle1.x)) /2)),
    raw = rectangle1.h-rectangle1.x,
    rah = rectangle1.h-rectangle1.x;

    SDL_Rect rectangleA ;
    rectangleA.x = rax;
    rectangleA.y = ray;
    rectangleA.w = raw/2;
    rectangleA.h =rah /2;
    SDL_SetRenderDrawColor(renderer,0,255,64,0); //VERT
    SDL_RenderFillRect(renderer, &rectangleA);

    SDL_Rect rectangleB ;
    rectangleB.x = rax + (raw/2);
    rectangleB.y = ray;
    rectangleB.w = raw/2;
    rectangleB.h =rah /2;
    SDL_SetRenderDrawColor(renderer,255,128,128,0);
    SDL_RenderFillRect(renderer, &rectangleB);

    SDL_Rect rectangleY ;
    rectangleY.x = rax ;
    rectangleY.y = ray+ (raw/2);
    rectangleY.w = raw/2;
    rectangleY.h =rah /2;
    SDL_SetRenderDrawColor(renderer,255,128,0,0); //ORANGE
    SDL_RenderFillRect(renderer, &rectangleY);

    SDL_Rect rectangleX ;
    rectangleX.x = rax + (raw/2);
    rectangleX.y = ray+ (raw/2);
    rectangleX.w = raw/2;
    rectangleX.h =rah /2;
    SDL_SetRenderDrawColor(renderer,0,0,255,0); //BLEU
    SDL_RenderFillRect(renderer, &rectangleX);

    SDL_RenderPresent(renderer);*/


2 réponses

  1. jisisv Messages postés 3678 Statut Modérateur 936
     
    Je n'ai évidemment pas testé tout ton code, mais si tu ouvre l'oeil, le bon, et que tu lis:
    warning: unused variable 'rectangleB' [-Wunused-variable]

    C'est une notification du compilateur indiquant que ta variable rectangleB est définie mais non utilisée. Si tu ne l'utilises nulle part, supprime la.
    1
    1. poparnassus Messages postés 462 Statut Membre 31
       
      SDL_RenderFillRect(renderer, affichage->rectangleA);


      pour le rectangleA par ex je l'utilise mais ca marche pas!
      j'ai mal fait un truc à mon avis
      0
  2. Pierre1310 Messages postés 8854 Statut Membre 652
     
    Salut,

    Si tu veux faire des pointeurs propre, utilise l'allocation dynamique quand tu les déclarent (malloc).
    0
    1. poparnassus Messages postés 462 Statut Membre 31
       
      ca se fait dans la structure ou dans la fonction ?
      0
    2. Pierre1310 Messages postés 8854 Statut Membre 652
       
      Dans la structure mais renseignes toi, ça fait un moment que je n'ai pas fait de C, tu m'as mis le doute ^^
      0
    3. poparnassus Messages postés 462 Statut Membre 31
       
      honnetement j'essaye plein de truc mes ca marche pas

      ma structure:
      typedef struct Affichage Affichage;
      struct Affichage
      {
          //Fenetre
          //int WIDTH, HEIGHT;
      
          int rax ;
          int ray ;
          int raw;
          int rah ;
      
          SDL_Texture *ArrierePlan;
      
          SDL_Rect *rectangle1;
          SDL_Rect *rectangleA;
          SDL_Rect *rectangleB;
          SDL_Rect *rectangleX;
          SDL_Rect *rectangleY;
      
      
      };
      


      Ma fonctio affichage:
      void ArrierePlan(char *titre,Affichage *affichage)
      {
          affichage->ArrierePlan = NULL;
          //affichage->Texture = NULL;
      
          //Creation de la fenetre
          screen = SDL_CreateWindow(titre,SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,WINDOW_W,WINDOW_H,SDL_WINDOW_SHOWN);
          //Creation du renderer
          renderer = SDL_CreateRenderer(screen,-1,SDL_RENDERER_ACCELERATED);
      
           if (screen == NULL || renderer == NULL)
          {
              printf("Impossible d'initialiser le mode ecran %s ,\n", SDL_GetError());
          }
      
          SDL_SetRenderDrawColor(renderer, 255, 0, 0, 0);
          SDL_RenderClear(renderer);
      
          //chargement de l'image de fond
         // affichage->ArrierePlan = SDL_LoadBMP("6wd.bmp");
      
          //SDL_CreateTextureFromSurface(renderer, affichage->ArrierePlan);
      
          int r1w =WINDOW_W  , r1h = WINDOW_H/4;
      
      
          SDL_Rect *rectangle1 ;
          affichage->rectangle1->x = 20;
          affichage->rectangle1->y = 20;
          affichage->rectangle1->w = r1w - (affichage->rectangle1->x*2);
          affichage->rectangle1->h = r1h - (affichage->rectangle1->y*2);
          SDL_SetRenderDrawColor(renderer,255,255,255,255); // blanc
          SDL_RenderFillRect(renderer,affichage->rectangle1);
      
      


      j'initialise ma structure
      void intialisationAffichage(Affichage *affichage)
      {
          SDL_Texture *ArrierePlan = NULL;
      
          affichage->rectangle1->x = 0;
          affichage->rectangle1->y = 0;
          affichage->rectangle1->w = 0;
          affichage->rectangle1->h = 0;
      
          affichage->rax = 0;
          affichage->ray = 0;
          affichage->raw = 0;
          affichage->rah = 0;
      
          affichage->rectangleA->x = 0;
          affichage->rectangleA->y = 0;
          affichage->rectangleA->w = 0;
          affichage->rectangleA->h = 0;
      
          affichage->rectangleB->x = 0;
          affichage->rectangleB->y = 0;
          affichage->rectangleB->w = 0;
          affichage->rectangleB->h = 0;
      
          affichage->rectangleY->x = 0;
          affichage->rectangleY->y = 0;
          affichage->rectangleY->w = 0;
          affichage->rectangleY->h = 0;
      
          affichage->rectangleX->x = 0;
          affichage->rectangleX->y = 0;
          affichage->rectangleX->w = 0;
          affichage->rectangleX->h = 0;
      }
      



      ||=== Build: Debug in 6wd_SDL2_test (compiler: GNU GCC Compiler) ===|
      C:\Users\Nico\Desktop\Projet C\6wd_SDL2_test\fonction.c||In function 'intialisationAffichage':|
      C:\Users\Nico\Desktop\Projet C\6wd_SDL2_test\fonction.c|66|warning: unused variable 'ArrierePlan' [-Wunused-variable]|
      C:\Users\Nico\Desktop\Projet C\6wd_SDL2_test\fonction.c||In function 'ArrierePlan':|
      C:\Users\Nico\Desktop\Projet C\6wd_SDL2_test\fonction.c|460|error: expected expression before '/' token|
      C:\Users\Nico\Desktop\Projet C\6wd_SDL2_test\fonction.c|454|warning: unused variable 'rectangle1' [-Wunused-variable]|
      ||=== Build failed: 1 error(s), 2 warning(s) (0 minute(s), 0 second(s)) ===|
      0
    4. Pierre1310 Messages postés 8854 Statut Membre 652
       
      Il y a quelque chose qui n'est pas clair dans ton code.

      SDL_Rect *rectangle1;
       affichage->rectangle1->x = 0;


      D'ou sort le x? Tu tu dis qu'il fait partis de rectangle1 qui est un pointeur de l'enssemble SDL_Rect donc x fait parti de SDL_Rect?
      0
    5. poparnassus Messages postés 462 Statut Membre 31
       
         SDL_Rect rectangle1 ;
          rectangle1.x = 20;
          rectangle1.y = 20;
          rectangle1.w = r1w - (rectangle1.x*2);
          rectangle1.h = r1h - (rectangle1.y*2);
          SDL_SetRenderDrawColor(renderer,255,255,255,255); // blanc
          SDL_RenderFillRect(renderer, &rectangle1);


      C'est le code sans utiliser de pointeur, ca fonctionne.

      SDL_Rect Fait partie de la librairie SDL2

      En faite SDL_Rect prend 4 variable x,y,w,h
      (x,y) position du rectangle
      w Longueur
      h Hauteur
      0