Problème d'allocation de classe

Résolu
dark_naruto25 Messages postés 127 Date d'inscription mardi 23 août 2005 Statut Membre Dernière intervention 9 mai 2011 - 19 avril 2006 à 01:05
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 - 19 avril 2006 à 14:59
Salut les amis

Voilà un autre problème bizzard.

J'ai une classe appelé Bitmap, qui comme son nom l'indique gère une image bmp.

Bref, à côté de cette classe j'ai une fonction :

void dessinerImage(char* image,int x,int y) {

Bitmap * img = new Bitmap(image); // alloue et charge en mémoire les infos de l'image (dimensions, palette)

initPalette(img->getPalette(),img->getNbrCouleur()); // initialise la palette (spécifique à une libraire utilisée)

img->show(x,y); // affichage de l'image (depuis le fichier du DD)

delete img;

}



Voilà pour les présentations. Dans un fichier, j'ai déclaré en globale :

Bitmap* cases[9];



et dans une fonction (du même fichier), je fait :

for(i=0; i<9; i++)

cases[i] = new Bitmap("Fichier"); <-- Prob



Et le problème c'est que quand la fonction dessinerImage(...) est appelé avant, j'ai une erreur de segmentation à la ligne Prob, et quand je mets l'appel à la fonction dessinerImage(...) en commentaire, ça fonctionne.



Donc je me remets à l'énorme potentiel de se site Web pour me trouver le problème.

7 réponses

dark_naruto25 Messages postés 127 Date d'inscription mardi 23 août 2005 Statut Membre Dernière intervention 9 mai 2011
19 avril 2006 à 11:54
voilà du nouveau !

On m'a donc reprécisé sur #Programmation que les erreurs de segmentations sont dût à un problème de mémoire !

Quelle découvertes me direz-vous ?! lol

Bref, j'ai jeté encore un oeil (encore heureux que j'en ai 2 !) sur le code.

Je viens de voir la ligne :

ligne = new char[ ... ];



mais plus bas il n'y a pas de ligne

delete [] ligne;

Ce que donc j'ai fait ! Et miracle ça fonctionne !

Je ne pensais pas que aloué un tableau de 100 cases fesait planter autant !

Mais bon toujours est-il que ça fonctionne !

Merci quand même à toi luhtor pour avoir pris le temps de répondre.
3
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
19 avril 2006 à 10:33
Je comprends pas tout a fait, finalement la fonction "dessiner image" elle est appelé quand ? Car a priori, ya pas d'erreur la .
0
dark_naruto25 Messages postés 127 Date d'inscription mardi 23 août 2005 Statut Membre Dernière intervention 9 mai 2011
19 avril 2006 à 11:15
et bien là où j'alloue les Bitmap (donc là où il y a le prob, c'est une fonction qui s'appel chargerImage()

et avant l'appel de cette fonction, j'appel la fonction dessinerMenu() qui appel la fonction dessinerImage().

et donc quand je met en commentaire la fonction dessinerMenu(), et bien ça marche, sinon j'obtiens une erreur de segmentation !
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
19 avril 2006 à 11:23
Ben avec ce que tu nous mets, on peut rien dire. Post d'avantage de code. Ya une erreur mémoire quelque part, faut la trouver.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dark_naruto25 Messages postés 127 Date d'inscription mardi 23 août 2005 Statut Membre Dernière intervention 9 mai 2011
19 avril 2006 à 11:43
Après quelques mise en commentaire de certaines lignes, j'ai déterminer la fonction qui pourrais couiller le bordel :



void Bitmap::show2(int x,int y) {

BYTE *ptr;

BYTE octet;

BYTE *ligne;

DWORD nbOctet,i,j;

FILE *fic;



fic = fopen(name,"r");

if( fic==NULL ) cerr<<"Erreur d'ouverture du fichier"<<endl;

else {

fseek(fic,header.BitmapOffset,SEEK_SET);

ligne = new BYTE[ header.Width ];

for(i=0; i<header.Heigth; i++) {

ptr = ligne;

nbOctet = (header.Width*header.Bpp)/8;

for(j=0; j<nbOctet; j++) {

fread(&octet,1,1,fic);

getCouleur(octet,ptr,8/header.Bpp);

}

if( (header.Width*header.Bpp)%8!= 0 ) {

nbOctet++;

fread(&octet,1,1,fic);

getCouleur(octet,ptr,(header.Width*header.Bpp)%8);

ptr++;

}

for(j=0; j<header.Width; j++) {

modifierCouleur( ligne[j] );

afficherPoint(x+j,y+header.Heigth-i);

}

if( nbOctet%4!=0 ) {

nbOctet = 4-(nbOctet%4);

fseek(fic,nbOctet,SEEK_CUR);

}

}

fclose(fic);

}

}



Maintenant il ne reste plus qu'à savoir pourquoi cette fonction fait faire des erreurs de segmentation plus loin dans le code !
0
dark_naruto25 Messages postés 127 Date d'inscription mardi 23 août 2005 Statut Membre Dernière intervention 9 mai 2011
19 avril 2006 à 11:47
Peut être vais-je préciser que la fonction show2(int x,int y); marche parfaitement bien.
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
19 avril 2006 à 14:59
Mais en soi delete[] ligne ne devrait rien changer. Au pire tu as des
fuites, mais ca devrait pas résoudre ton problème. Mais bon, c'est
illisible comme fonction, mais ca, ca vient pas trop de toi. Toutes les
manipulations de fichiers, c'est le boxon.
0
Rejoignez-nous