[C] probleme realloc

Fermé
kanorado Messages postés 107 Date d'inscription samedi 7 juillet 2007 Statut Membre Dernière intervention 25 juillet 2011 - 17 déc. 2008 à 14:37
kanorado Messages postés 107 Date d'inscription samedi 7 juillet 2007 Statut Membre Dernière intervention 25 juillet 2011 - 17 déc. 2008 à 20:08
bonjour!
voila je cherche à faire un jeu de tir avec la SDL
je veut que quand je tire quelque part , l'impact reste affiché, et comme je fai une boucle evenementielle, selon moi : il faut retenir les coordonnées de ces impacts.
je tente donc de faire un tableau dynamique : quand je clique quelque part, le tableau s'agrandit et retiens les coordonnées , ça compile tranquille, mais quand je clique : message d'erreur qui indique (ainsi que le debugger)
Windows a déclenché un point d'arrêt dans kill them all.exe.

Cela peut être dû à une défaillance du tas qui indique un bogue dans kill them all.exe ou l'une des DLL chargées.

Cela peut également être dû à l'appui sur la touche F12 lorsque kill them all.exe a le focus

La fenêtre Sortie peut contenir des informations de diagnostic supplémentaires.
Le programme '[2828] kill them all.exe: Natif' s'est arrêté avec le code 0 (0x0).

voila et visual m'indique d'une fleche la ligne du realloc.
savez vous pourquoi?
merci de votre aide^^
voici le code:
ps : pour l'intant , le code n'est sensé afficher qu'un point qui se deplace quand je clique ailleurs.

#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>



int main(int argc, char *argv[])
{

SDL_Event event;
int continuer = 1;
int entree = 0;
long nombremarque = 0;
long i = 0;
long creer = 0;
SDL_Rect *tableau = NULL; //pointeur pour créer et redimentionner le tableau

SDL_Surface *ecran = NULL, *elodie = NULL, *marque = NULL, *arriereplan = NULL, *fond = NULL, *cible = NULL, *cible2 = NULL, *cadre = NULL, *pistolet = NULL;
SDL_Rect positionFond;
SDL_Rect positionFond2;
SDL_Rect positioncadre;
SDL_Rect positionpistolet;
SDL_Rect positioncible;
SDL_Rect positionelodie;
SDL_Rect positionmarque;

positionFond.x = 0;
positionFond.y = 0;
positionFond2.x = 0;
positionFond2.y = 0;
positioncadre.x = 0;
positioncadre.y = 0;
positionpistolet.x = 0;
positionpistolet.y = 0;
positioncible.x = 0;
positioncible.y = 0;
positionelodie.x = 290;
positionelodie.y = 200;
positionmarque.x = 0;
positionmarque.y = 0;


SDL_Init(SDL_INIT_VIDEO);
SDL_WM_SetIcon (SDL_LoadBMP("cible.bmp"), NULL);

ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
SDL_WM_SetCaption("Kill them all!", NULL);

arriereplan = SDL_LoadBMP("fond jeu.bmp");
fond = SDL_LoadBMP("fond jeu pas entree.bmp");
cible2 = SDL_LoadBMP("cible.bmp");
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
SDL_BlitSurface(arriereplan, NULL, ecran, &positionFond);

SDL_PollEvent(&event);
while((event.type != SDL_QUIT) && (event.key.keysym.sym != SDLK_RETURN))/*tant que je ferme pas ni appuie
sur entrée */
{
SDL_PollEvent(&event);
SDL_Delay(500);
SDL_BlitSurface(fond, NULL, ecran, &positionFond2);
SDL_Flip(ecran);
SDL_Delay(500);
SDL_BlitSurface(arriereplan, NULL, ecran, &positionFond);
SDL_Flip(ecran);
}
if (event.type == SDL_QUIT)// si j'ai appuyé sur fermer
{
SDL_FreeSurface(arriereplan);
SDL_FreeSurface(fond);
continuer = 0;

}
else if (event.type != SDL_QUIT) // si j'ai pas appuyé sur fermer (et appuyé sur entrée)
{
SDL_FreeSurface(arriereplan);
SDL_FreeSurface(fond);
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); /* On efface l'écran */

cadre = SDL_LoadBMP("cadre.bmp");
pistolet = SDL_LoadBMP("pistolet.bmp");
elodie = IMG_Load("elodie.png");
marque = SDL_LoadBMP("marque.bmp");

SDL_BlitSurface(cadre, NULL, ecran, &positioncadre);
SDL_SetColorKey(pistolet, SDL_SRCCOLORKEY, SDL_MapRGB(pistolet->format, 255, 255, 255));//je rend le blanc transparent AVANT de blitter l'image
SDL_BlitSurface(pistolet, NULL, ecran, &positionpistolet);
SDL_ShowCursor(SDL_DISABLE);
SDL_SetColorKey(cible2, SDL_SRCCOLORKEY, SDL_MapRGB(cible2->format, 255, 255, 255));
SDL_SetColorKey(marque, SDL_SRCCOLORKEY, SDL_MapRGB(marque->format, 255, 255, 255));
SDL_BlitSurface(elodie, NULL, ecran, &positionelodie);
SDL_BlitSurface(cible2, NULL, ecran, &positioncible);
SDL_Flip(ecran);
}


while (continuer)
{
SDL_PollEvent(&event);
switch (event.type)
{
case SDL_QUIT:
continuer = 0;
break;

case SDL_MOUSEBUTTONDOWN:
nombremarque++;
if (creer == 0)
{
tableau = malloc(nombremarque * sizeof(SDL_Rect));
if (tableau == NULL)
{
fprintf(stderr, "alloacation impossible%s\n", SDL_GetError());
}
else
{
creer++;
}
}
tableau = realloc(tableau, nombremarque * sizeof(SDL_Rect));
if (tableau == NULL)
{
fprintf(stderr, "realloacation impossible%s\n", SDL_GetError());
}
else
{
tableau[nombremarque].x = event.motion.x;
tableau[nombremarque].y = event.motion.y;
}



break;

case SDL_MOUSEMOTION:
positioncible.x = event.motion.x;
positioncible.y = event.motion.y;
break;

}
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
SDL_BlitSurface(cadre, NULL, ecran, &positioncadre);
SDL_BlitSurface(pistolet, NULL, ecran, &positionpistolet);
SDL_BlitSurface(elodie, NULL, ecran, &positionelodie);
while (i < nombremarque)
{
i++;
SDL_BlitSurface(marque, NULL, ecran, &tableau[i]);
}
SDL_BlitSurface(cible2, NULL, ecran, &positioncible);
SDL_Flip(ecran);
}
free(tableau);
SDL_Quit();

return EXIT_SUCCESS;
}

2 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
17 déc. 2008 à 14:49
Saluit
etrange ton problème. Ton code est assez illisible sans les indentations.
d'après le man realloc ne ccré pas d'erreur, et je n'ai rien vu de faux dans ce que tu as écris. Je pense que l'erreur doit venir d'ailleurS.
1
kanorado Messages postés 107 Date d'inscription samedi 7 juillet 2007 Statut Membre Dernière intervention 25 juillet 2011 17
17 déc. 2008 à 20:08
pourquoi c'est toujours moi lol
je ne peut donc rien y faire?
0