Bonjour bonjour
Comme mentionné dans le titre je rencontre un souci lors d'un appel a SDL_FillRect.
Les circonstances sont les suivantes:
Un tableau de SDL_Surface (qui va contenir les images d'un menu graphique) est déclaré:
Code : Sélectionner tout - Visualiser dans une fenêtre à part SDL_Surface **bmpMenu = NULL;
Puis le programme fait un appel à une fonction chargerMenu déclarée et fonctionnant comme suit:
Code : Sélectionner tout - Visualiser dans une fenêtre à part SDL_Surface **chargerMenu(SDL_Surface **bmpMenu);Cette fonction alloue de la mémoire avec malloc pour 3 pointeurs sur SDL_Surface, puis alloue de la mémoire pour une SDL_Surface avec SDL_CreateRGBSurface pour chacun des 3 pointeurs.
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 SDL_Surface **chargerMenu(SDL_Surface **bmpMenu) { bmpMenu = malloc(3*sizeof(SDL_Surface*)); bmpMenu[0] = SDL_CreateRGBSurface(SDL_HWSURFACE, 50, 50, 32, 0, 0, 0, 0); bmpMenu[0]->clip_rect.x = 200; bmpMenu[0]->clip_rect.y = 100; bmpMenu[1] = SDL_CreateRGBSurface(SDL_HWSURFACE, 50, 50, 32, 0, 0, 0, 0); bmpMenu[1]->clip_rect.x = 200; bmpMenu[1]->clip_rect.y = 200; bmpMenu[2] = SDL_CreateRGBSurface(SDL_HWSURFACE, 50, 50, 32, 0, 0, 0, 0); bmpMenu[2]->clip_rect.x = 200; bmpMenu[2]->clip_rect.y = 300; int i; for (i=0; i<3; i++) if (bmpMenu[i] == NULL) printf("Souci d'allocation pour la %d surface\n", i); return bmpMenu; }
Les coordonnées des surfaces sont stockées directement dans clip_rect.
Finalement le programme appelle une fonction colleMenu définie comme ci-dessous:
Code : Sélectionner tout - Visualiser dans une fenêtre à part void colleMenu(SDL_Surface **bmpMenu, SDL_Surface *ecran;)Les SDL_Delay servent a temporiser le programme pour observer son exécution.
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 void colleMenu(SDL_Surface **bmpMenu, SDL_Surface *ecran) { SDL_Rect pos; SDL_Delay(2000); SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 50, 50, 50)); SDL_Flip(ecran); int i; for (i=0; i<3; i++) { SDL_Delay(2000); pos.x = bmpMenu[i]->clip_rect.x; // Accès en lecture: OK pos.y = bmpMenu[i]->clip_rect.y; bmpMenu[i]->clip_rect.x = 123; // Test d'accès en écriture: OK SDL_FillRect(bmpMenu[i], NULL, SDL_MapRGB(ecran->format, 255, 0, 0)); // Segmentation Fault pour i=1 SDL_BlitSurface(bmpMenu[i], NULL, ecran, &pos); SDL_Flip(ecran); } SDL_Flip(ecran); }
La surface principale, ecran, est remplie avec du gris, elle s'affiche bien a l'écran.
Puis je lance une boucle for qui va récupérer les coordonnées de chaque surface stockées dans clip_rect, appliquer une couleur rouge puis coller cette surface et rafraichir l'écran.
Comme indiquée en commentaire, les coordonnées récupérées dans pos sont valides et il est toujours possible de modifier les coordonnées originales des surfaces.
Seulement la suite ne se déroule pas tout a fait comme voulu:
- lors de la première itération, le carré correspondant a bmpMenu[0] s'affiche au bon endroit mais il est noir.
- lors du deuxième passage dans la boucle, SDL_FillRect provoque une erreur de segmentation (pour bmpMenu[1] donc).
- aucune surface n'est NULL.
Détail: lorsque une couleur (marron) était appliquée dans chargerMenu puis remplacée par une autre (rouge) dans colleMenu, le premier carré, bmpMenu[0] restait marron.
Voici les 3 indices dont je dispose actuellement, les suspicions que j'ai se portent sur:
- mauvaise utilisation des tableaux de SDL_Surface (fort probable)
- autre erreur (bien probable)
- incohérence au niveau du paramètre SDL_PixelFormat* demandé par SDL_MapRGB pour générer les couleurs (probable)
A savoir, ces 2 fonctions sont appelées successivement dans la même fonction:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 void menu(int *continuer, SDL_Surface *ecran) { SDL_Surface **bmpMenu = NULL; bmpMenu = chargerMenu(bmpMenu); colleMenu(bmpMenu, ecran); ... libereMenu(bmpMenu); }
Je pense que mon code n'est pas bien compliqué pour toute personne ayant déjà manipulé la SDL (et le C) et qu'un regard neuf sur celui-ci pourrait m'apporter quelques éclaircissements, donc merci d'avance pour toute réponse
EDIT: La solution a été donnée sur un autre forum:
Ne jamais modifier les variables contenues dans clip_rect
Comme indiqué sur la doc de la SDL
Je ne comprends tout de même pas pourquoi cela provoque un plantage, si quelqu'un a une explication je suis preneur
Quoiqu'il en soit: problème résolu![]()
Partager