[mac C C++ ] Help , j y arrive pas:allocation /desallocation image

Help , j y arrive pas:allocation /desallocation image [mac C C++ ] - C++ - Programmation

Marsh Posté le 08-11-2002 à 14:20:25    

Salut,
 
Je suis en train de faire un programme ultra simple sur Mac  mais rien ne marche.... Je précise tout de suite, je suis un programmeur PC et je n'ai jamais programmé sur mac ... le programme que je dois faire doit tourner sur PC et sur Mac ... evidemment la version PC fonctionne et ca m'a pris 30 mn a developper.
Par contre la partie mac je n y arrive pas du tout : je m explique : le programme doit tout simplement charger X images et les afficher en boucle les unes apres les autres (simple non ?)  
 
La premiere version de mon programme mac chargeait toutes les images en memoire et cela marchait car je testait avec 2-3 images. par contre des que j en mets 6 ou 7 (besoin du programme) il m affiche les 5 premieres puis les suivantes non. Je me suis renseigné et effectivement si le programme n a pas assez de memoire il ne les crée pas en mémoire (j hallucine et le swap ca sert a quoi) bref 7 images a 1,5 MO l image ca fait 10,5 MO et le mac n est pas capable d allouer ca ? (ou alors j'ai fait une erreur mais je vois pas où)... J ai evidemment fait pomme+I pour augmenter la quantité de mémoire : a l origine il y a 4 MO d alloué donc il ne m'affichait que les 2 premieres, j'ai mis 8 il en affiche 4 , 16 et plus il ne m'affiche pas plus de 5 images bouhhh).
 
Donc je me suis dit, bah plutot que de tout charger, je vais les charger une par une a leur tour... Eh bah c est encore pire : la il m'affiche la premiere puis la deuxieme decalée (pourquoi ? pb de pointeur memoire a mon avis) puis la 3eme bonne, la 4eme brouillée etc ...n importe quoi.  
 
j utilise NewGWorld pour creer mon image et je fais DisposeGWorld pour desallouer. Il y a autant d appel a New... qu a Dispose ... (verifié et OK)
 
 
Pourtant j ai l habitude de programmer (je suis developpeur  PC depuis 5 ans) mais la c est incomprehensible mais comme je  dis , j ai ptet oublié quelque chose ou alors je ne fais pas correctement . Je ne connais pas du tout le mac si sa philosophie de gestion de memoire etc ... Alors si quelqu un peut m'aider (je ne veux pas acheter de la doc car je ne programmerai plus jamais sur mac mais la je suis obligé de faire ce petit programme) ce serait sympa.
 
Merci.


Message édité par xilebo le 13-11-2002 à 10:21:07
Reply

Marsh Posté le 08-11-2002 à 14:20:25   

Reply

Marsh Posté le 08-11-2002 à 16:28:04    

Up aidez moi please :cry:  
 
Je peux mettre le code si vous voulez ... y a bien un programmeur macintosh sur ce forum !
 
Bon sinon j ai une autre solution (enfin si je puis dire) . Les images que je charge actuellement sont des images jpg. Mais comme y a aucun outil pour les charger j ai utilisé la libjpg que j'ai adpaté pour le mac ... ptet y a une erreur.  
 
Existe t il un format d image standard au 2 machine et inclus en natif dans le kit de developppement ? (je suppose que mac sait pas lire le bmp)


Message édité par xilebo le 08-11-2002 à 16:30:04
Reply

Marsh Posté le 08-11-2002 à 16:41:59    

xilebo a écrit a écrit :

Up aidez moi please :cry:  
 
Je peux mettre le code si vous voulez ... y a bien un programmeur macintosh sur ce forum !
 
Bon sinon j ai une autre solution (enfin si je puis dire) . Les images que je charge actuellement sont des images jpg. Mais comme y a aucun outil pour les charger j ai utilisé la libjpg que j'ai adpaté pour le mac ... ptet y a une erreur.  
 
Existe t il un format d image standard au 2 machine et inclus en natif dans le kit de developppement ? (je suppose que mac sait pas lire le bmp)  




J ai jamais programme sur mac mais j en ai utilise et je peux dire kil li les BMP.
 
Bon courage!
PS:demande dans la partie graphisme aussi,ils peuvent parfois t aider car de nombreux graphistes sont sous-mac donc s ils programment ils pourront t aider.
 

Reply

Marsh Posté le 08-11-2002 à 17:10:42    

c pas ce que j ai voulu dire ... evidemment on peut lire des BMP sur mac avec un logiciel type photoshop... mais dans le kit de developpement standard de Apple je  doute qu il y ait de quoi ouvrir des images BMP .... car je suppose que c est dans on code qu il y a des erreurs notamment au niveau du chargement des jpg (car ailleurs je vois pas , mon code est quasi vierge).
 
Je viens de reessayer mon programme en ayant modifié au maximum le code  
 

Code :
  1. Handle   hData = nil;
  2. ImageDataPtr    pImage;
  3. if (hCurrentImage) {
  4.  HLock(hCurrentImage);
  5.  pImage = (ImageDataPtr) *hCurrentImage;
  6.  if (pImage != NULL) {
  7.   hData = pImage->hNext;
  8.   int w,h;
  9.   m_offPtr;
  10.   m_offPtr = LoadImageFromJpeg(pImage->name, w, h);
  11.   ImageDataPtr(*hCurrentImage)->width  = w;
  12.   ImageDataPtr(*hCurrentImage)->height = h;
  13.   MoveWindow(mainPtr,(X - pImage->width)/2,(Y - pImage->height)/2,true);
  14.   SizeWindow(mainPtr, pImage->width, pImage->height, true);
  15.   if (m_offPtr && mainPtr) {
  16.    PixMapHandle pix = GetGWorldPixMap(m_offPtr);
  17.    LockPixels(pix);
  18.    Rect rect;
  19.    //GrafPtr pOldPort;
  20.    //GetPort(&pOldPort);
  21.    SetRect(&rect, 0, 0,/* pImage->width*/w,/* pImage->height*/h);
  22.    CopyBits((BitMap *)*pix/*&  ( (GrafPtr) m_offPtr)->portBits*/, & ( (GrafPtr) mainPtr)->portBits, &rect, &rect, srcCopy, nil);
  23.    //SetPort(pOldPort);
  24.    UnlockPixels(pix);
  25.   }
  26.  } // FIN pImage != NULL
  27.  HUnlock(hCurrentImage);
  28. }
  29. hCurrentImage = hData ? hData : hImages;
  30. Microseconds(&prevTime);


 
m_offPtr est de type CGrafPtr
et ImageDataPtr est une liste chainee contenant juste les noms des fichiers (a l o rigine liste chainee des images mais prend trop de place en memoire)
Donc il y a un timer : a chaque appel du timer ,il appelle la fonction nextimage (la fonction que je viens de donner)
 
celle ci fait dans l ordre :
 
passer a l element suivant de la liste (element courant = pImage)
 
Libere m_offPtr s il existe
 
charge la prochaine image dans m_offPtr (avec loadimagefromjpg)
 
Copie l image en memoire avec un copybits...
 
Resultat : si je ne fais pas le DisposeGworld, ca marche jusqu a temps qu il n y ait plus de memoire (normal je ne libere pas et j ecrase le pointeur).
 
Si je fais le DisposeGWorld, il m'affiche n importe quoi , de temps en temps une image correcte, sinon une image decalée mais pas celle qui devrait correspondre a l index (apparemment pb de pointage de memoire)
 
Ai je fais une erreur dans mon code ? ou alors je libere trop tot la memoire ? (c ce qu on m a dit)
 

Reply

Marsh Posté le 11-11-2002 à 20:34:11    

up

Reply

Marsh Posté le 11-11-2002 à 21:04:57    

tu es sous X?
 
pourquoi ne pas avoir fait ça en java?
ton prog aurait fonctionner tout de suite sur pc et mac


---------------
Borland rulez: http://pages.infinit.net/borland
Reply

Marsh Posté le 11-11-2002 à 23:14:50    

non je suis pas sous X et c pour faire un programme qui ne necessite  aucune install de la part des utilisateurs , or ce n'est pas le cas avec java car il faudrait installer la java virtual machine .

Reply

Marsh Posté le 11-11-2002 à 23:53:26    

quasi tout le monde on une jvm surtout s'il ont le web


---------------
Borland rulez: http://pages.infinit.net/borland
Reply

Marsh Posté le 12-11-2002 à 10:10:11    

Peut on alors generer des executables en java ? a mon avis non mais dans ce cas comment l utilisateur va -t- il savoir quel fichier lancer ? et peut on lire des jpg avec java?
 
Merci

Reply

Marsh Posté le 13-11-2002 à 10:02:48    

J'ai une info supplementaire :
 
J ai trouvé ou ca deconne mais je ne sais pas comment faire pour que ca fonctionne... ma procedure d affichage est bonne par contre c est mon chargement d image jpg qui ne marche pas :
 
J ai besoin d un offscreen graphic world (cGrafPtr) je fais donc un NewGWorld... la fonction se passe bien puisque la valeur de retour est egale a noerr.
 
Ensuite je fais un GetGWorldPixmap pour obtenir le PixmapHandle  
 
 
Je fais un LockPixels de mon PixmapHandle et la fonction ne me renvoie pas false donc c est que ca  c est bien passé (de plus PixmapHandle est different de NULL)
 
par contre de facon aleatoire quand je veux recuperer les infos de PixmapHandle (qui est en fait un pointeur de pointeur sur une structure Pixmap) , soit elles sont bonnes dans ce cas l affichage se passe bien , soit elles sont complement erronées et dans ce cas c pour ca qu il affiche n importe quoi pour l image...
 
du genre pixelSize = 32 normalement, pixelSize = -39760 quand c est erroné...
 
De meme que pour tous les champs de la structure.
 
Apparemment soit l'allocation s est mal passée soit il pointe au mauvais endroit.... Dans les 2 cas je ne sais pas quoi faire car pour l allocation il me renvoie  des messages comme quoi ca s est bien passé et pour l'adresse c est une fonction de l API apple qui me la donne.
 
Aidez moi :cry:

Reply

Marsh Posté le 13-11-2002 à 10:02:48   

Reply

Marsh Posté le 13-11-2002 à 12:32:31    

Up

Reply

Sujets relatifs:

Leave a Replay

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