sdl et vc++2010

sdl et vc++2010 - C - Programmation

Marsh Posté le 11-05-2012 à 15:39:08    

slt tout le monde,
je sais bien mes amis que c'est pas possible d'afficher une image avec c++. par contre je m'adresse à vous pour savoir s'il existe une solution, en utilisant des autres bibliothèques (par exemple), et s'il vous plait m'expliquer précisément comme l'ajouter (ces bibliothèques) en détail .
Ce pour cela j'ai utilisé le sdl et puis j'ai déjà rencontré un code pour affichage une image en utilisant
sdl_image et le voilà:

Code :
  1. #include "SDL.h"
  2. #include "SDL_image.h"
  3. #include "tools.h"
  4. int main(int argc, char *argv[])
  5. {
  6. int pidx = 0 ;
  7. SDL_Surface *screen ;
  8. enum walk { justice1 , justice2 , justice3 , justice4
  9. , justice5 , justice6 , justice_No };
  10. SDL_Surface *anim[justice_No];
  11. SDL_Rect animRect ;
  12. animRect.x = 160 ;
  13. animRect.y = 160 ;
  14. atexit(SDL_Quit);
  15. if( SDL_Init(SDL_INIT_VIDEO) < 0 ) exit(1);
  16. SDL_WM_SetCaption("SDL Window", NULL);
  17. screen = SDL_SetVideoMode( 400 , 300 , 32 , SDL_DOUBLEBUF|SDL_HWSURFACE|SDL_ANYFORMAT);
  18. // Use the new add image loader function to load GIF , JPG , PNG image file.
  19. // Here shows two equivalent ways to load a image file that has a white
  20. // background (RGB=255,255,255)
  21. anim[0] = ImgLoader("./anim/justice1.gif",1,255,255,255,0);
  22. anim[1] = ImgLoader("./anim/justice2.gif",1,255,255,255,0);
  23. anim[2] = ImgLoader("./anim/justice3.gif",1,255,255,255,0);
  24. anim[3] = ImgLoader("./anim/justice4.gif",1,255,255,255,0);
  25. anim[4] = ImgLoader("./anim/justice5.gif",1,255,255,255,0);
  26. anim[5] = ImgLoader("./anim/justice6.gif",1,255,255,255,0);
  27. for(int tick=0 ; tick<1000 ; tick++ ) {
  28. SDL_FillRect(screen , NULL , 0x221122);
  29. SDL_BlitSurface( anim[pidx] , NULL , screen , &animRect );
  30. SDL_Flip(screen);
  31. SDL_Delay(20); // Delay 20 msec
  32. pidx++;
  33. if(pidx >= justice_No) pidx = 0;
  34. }; // for(int tick=0 ; tick<1000 ; tick++ ) { END
  35. return 0;
  36. }


Mais j'ai une problème au compilation , il m'a donneé un msg d'erreure comme suit:

Code :
  1. Exception non gérée à 0x77ce15de (ntdll.dll) dans sdlimg.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000004.


    en fait j'espère que vous avez un volonté de m'aider car j'ai un longtemps que j'ai compris cette erreure car je suis débutant en langage c.
    merci et au revoir .

Reply

Marsh Posté le 11-05-2012 à 15:39:08   

Reply

Marsh Posté le 11-05-2012 à 17:09:04    

Moué, déjà ton erreur ce n'est pas à la compilation mais à l'éxecution de ton programme. Visiblement un déréférencement de pointeur NULL, avec 99% de chance qu'une des fonctions ImgLoader() ait retourné une telle valeur. Commence déjà par vérifier le code de retour de cette fonction :
 

Code :
  1. for (pidx = 0; pidx < justice_No; pidx ++) {
  2.    char buffer[64];
  3.    sprintf(buffer, "./anim/justice%d.gif", pidx);
  4.    anim[pidx] = ImgLoader(buffer,1,255,255,255,0);
  5.    if (anim[pidx] == NULL)
  6.        fprintf(stderr, "Impossible de charger '%s'.\n", buffer), exit(1);
  7. }


 
À remplacer ton bloc de ImgLoader(). Accessoirement compiler en DEBUG pourrait te donner la ligne où ça plante...

Reply

Marsh Posté le 11-05-2012 à 17:49:24    

tpierron a écrit :

Moué, déjà ton erreur ce n'est pas à la compilation mais à l'éxecution de ton programme. Visiblement un déréférencement de pointeur NULL, avec 99% de chance qu'une des fonctions ImgLoader() ait retourné une telle valeur. Commence déjà par vérifier le code de retour de cette fonction :
 

Code :
  1. for (pidx = 0; pidx < justice_No; pidx ++) {
  2.    char buffer[64];
  3.    sprintf(buffer, "./anim/justice%d.gif", pidx);
  4.    anim[pidx] = ImgLoader(buffer,1,255,255,255,0);
  5.    if (anim[pidx] == NULL)
  6.        fprintf(stderr, "Impossible de charger '%s'.\n", buffer), exit(1);
  7. }


 
À remplacer ton bloc de ImgLoader(). Accessoirement compiler en DEBUG pourrait te donner la ligne où ça plante...


slt M,
je vous remercie a votre intéressante , mais j'ai déjà insérer une fichier .h dans mon projet:

Code :
  1. #ifndef TOOLS_H
  2. #define TOOLS_H
  3. #include "SDL.h"
  4. #include "SDL_image.h"
  5. // This function load a image file to a surface
  6. // Set bCKey with colorkey (R,G,B) to clear a color on the image
  7. // Set alpha value for transparency 0(No transparent) ~ 255(Ivisible)
  8. inline SDL_Surface *ImgLoader(char *file,bool bCKey, int r , int g , int b , int alpha)
  9. {
  10.     SDL_Surface *pic;
  11.     pic = IMG_Load(file); // From SDL_image.h , load the image to pic
  12.     // Log error message into stderr.txt if happened
  13.     if(pic==NULL) fprintf(stderr,"Missing image %s : %s\n",file,IMG_GetError());
  14.     if( bCKey ) {
  15.         // Sets the color key (transparent pixel) in a blittable surface and RLE acceleration.
  16.         SDL_SetColorKey(pic,SDL_SRCCOLORKEY|SDL_RLEACCEL,SDL_MapRGB(pic->format,r,g,b));
  17.          }
  18.     if(alpha) SDL_SetAlpha(pic, SDL_SRCALPHA|SDL_RLEACCEL , 255 - alpha);
  19.     // This function takes a surface and copies it to a new surface of the
  20.     // pixel format and colors of the video framebuffer, suitable for fast
  21.     // blitting onto the display surface.
  22.     pic = SDL_DisplayFormat(pic);
  23.     return (pic);
  24. }
  25. #endif

 
alors que le debug de ce projet est arrêté au niveau la ligne suivante:

Code :
  1. anim[0] = ImgLoader("./anim/justice1.gif",1,255,255,255,0);

 

Reply

Marsh Posté le 11-05-2012 à 18:07:39    

Ha, ha, l'idée est bonne, mais ta fonction ImgLoader devrait sortir de cette fonction si pic == NULL. Dans le cas contraire, ça risque de planter par la suite (je ne me rapelle plus si les fonctions de la SDL sont NULL-safe, probablement non). Genre la ligne 15, je ferais un truc du genre :
 

Code :
  1. if (pic==NULL) {
  2.    fprintf(stderr,"Missing image %s : %s\n",file,IMG_GetError());
  3.    return NULL;
  4. }


 
Vérifie dans la console, si le message apparaît bien...
 
Edit: accessoirement la ligne "pic = SDL_DisplayFormat(pic);" provoque un memory-leak. Pas le drame, mais bon.

Message cité 1 fois
Message édité par tpierron le 11-05-2012 à 18:09:27
Reply

Marsh Posté le 11-05-2012 à 18:39:16    

tpierron a écrit :

Ha, ha, l'idée est bonne, mais ta fonction ImgLoader devrait sortir de cette fonction si pic == NULL. Dans le cas contraire, ça risque de planter par la suite (je ne me rapelle plus si les fonctions de la SDL sont NULL-safe, probablement non). Genre la ligne 15, je ferais un truc du genre :
 

Code :
  1. if (pic==NULL) {
  2.    fprintf(stderr,"Missing image %s : %s\n",file,IMG_GetError());
  3.    return NULL;
  4. }


 
Vérifie dans la console, si le message apparaît bien...
 
Edit: accessoirement la ligne "pic = SDL_DisplayFormat(pic);" provoque un memory-leak. Pas le drame, mais bon.


 
dsl M,apparemment j'ai bq de problème j'espère que suis trop lourd avec mes questions .l'erreur se dépasse mais il m'affiche une fenêtre noire et il m'écrit :

Code :
  1. 'sdlimg.exe' : Chargé 'C:\Program Files\WIDCOMM\Bluetooth Software\syswow64\BtMmHook.dll', Cannot find or open the PDB file

 .
je souhaite que vous trouvez ma faute car je suis vraiment debutant en langage c.

Reply

Marsh Posté le 11-05-2012 à 19:42:13    

hb2012 a écrit :


dsl M,apparemment j'ai bq de problème j'espère que suis trop lourd avec mes questions .l'erreur se dépasse mais il m'affiche une fenêtre noire et il m'écrit :

Code :
  1. 'sdlimg.exe' : Chargé 'C:\Program Files\WIDCOMM\Bluetooth Software\syswow64\BtMmHook.dll', Cannot find or open the PDB file

 .
je souhaite que vous trouvez ma faute car je suis vraiment debutant en langage c.


 
Ça n'a pas l'air d'une erreur, juste un message pour dire que les symboles de debug n'ont pas été trouvé pour cette DLL. DLL qui n'a à priori rien à voir avec ton problème.

Reply

Marsh Posté le 12-05-2012 à 09:31:54    

tpierron a écrit :


 
Ça n'a pas l'air d'une erreur, juste un message pour dire que les symboles de debug n'ont pas été trouvé pour cette DLL. DLL qui n'a à priori rien à voir avec ton problème.


bonjour M,
Mais quelle est la problème a votre avis de ne pas m'afficher ce que je veux le faire .
je viens de vous mettre en évidence de cible à notre sujet ,c'est à partir de ce site:
https://sites.google.com/site/sdlin [...] /sdl_image
vous pouvez m'aider à résoudre cette tache car elle d'importance capital chez moi, avec un facteur de temps très précieux.
si vous voulez M, et ça vous dérange pas bien sur ,c'est surement dépend de votre disponibilité.

Reply

Marsh Posté le 12-05-2012 à 11:07:19    

Citation :

syswow64

Tu es en 64 bits? et tu as recompilé le source SDL auparavant? Parce que si tu compiles en 64 bits avec les DLL 32 bits, je suis pas sur que ça marche.
Par contre le source de SDL doit être recompilable en 64 bits depuis pas mal de temps.
A+,


Message édité par gilou le 12-05-2012 à 11:10:13

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed