[C] probleme realloc
kanorado
Messages postés
107
Date d'inscription
Statut
Membre
Dernière intervention
-
kanorado Messages postés 107 Date d'inscription Statut Membre Dernière intervention -
kanorado Messages postés 107 Date d'inscription Statut Membre Dernière intervention -
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;
}
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;
}