SDL2 Les pointeurs

Résolu
poparnassus Messages postés 426 Date d'inscription   Statut Membre Dernière intervention   -  
poparnassus Messages postés 426 Date d'inscription   Statut Membre Dernière intervention   -
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

jisisv Messages postés 3645 Date d'inscription   Statut Modérateur Dernière intervention   934
 
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
poparnassus Messages postés 426 Date d'inscription   Statut Membre Dernière intervention   30
 
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
Pierre1310 Messages postés 8564 Date d'inscription   Statut Membre Dernière intervention   651
 
Salut,

Si tu veux faire des pointeurs propre, utilise l'allocation dynamique quand tu les déclarent (malloc).
0
poparnassus Messages postés 426 Date d'inscription   Statut Membre Dernière intervention   30
 
ca se fait dans la structure ou dans la fonction ?
0
Pierre1310 Messages postés 8564 Date d'inscription   Statut Membre Dernière intervention   651
 
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
poparnassus Messages postés 426 Date d'inscription   Statut Membre Dernière intervention   30
 
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
Pierre1310 Messages postés 8564 Date d'inscription   Statut Membre Dernière intervention   651
 
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
poparnassus Messages postés 426 Date d'inscription   Statut Membre Dernière intervention   30
 
   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