manta7
Messages postés105Date d'inscriptionsamedi 25 janvier 2003StatutMembreDernière intervention13 décembre 2008
-
25 mai 2007 à 16:38
manta7
Messages postés105Date d'inscriptionsamedi 25 janvier 2003StatutMembreDernière intervention13 décembre 2008
-
27 mai 2007 à 16:41
Salut à tous !
Je suis en train de coder un petit projet mais j'ai un probleme de mémoire avec la fonction realloc()
C'est assez prise de tete car c'est dans des strucutes mais bon voici mon probleme :
J'ai mes 3 structures :
typedef struct _unite {
int
xright, yright, //Chance d'aller a droite
xleft, yleft, //gauche
xup, yup, //haut
xdown, ydown, //bas
xvue, yvue, //Chance de regarder aux alentours pour prendre
vietotale, viebase, vie;
}unite;
typedef struct _classe {
unite *unite;
int n; //Nombre d'unités par classe
}classe;
struct _map {
int affichage; //Affichage sur affiche()
int dejavu; //Permet de savoir si une unité a déja effectuée un tour
unite *unite;
int element; //Numero d'element dans unite[]
}map[SMAP][SMAP];
Pour l'allocation tout se passe parfaitement maintenant quand je teste un
Pour info j'avais alloué un utilisant la variable n dans la structure classe et avant le realloc, j'incrémente celle ci. C'est une sorte d'indice de taille.
The_Guardian
Messages postés317Date d'inscriptionvendredi 25 mai 2007StatutMembreDernière intervention19 octobre 20071 25 mai 2007 à 17:06
Salut,
Deja, je ne comprend pas ton "classe[map[x][y].affichage].unite"
classe n'est pas un tableau ou un pointeur pour le moment et je vois pas pourquoi tu utiliserais ".affichage" comme indice de "classe"
et donne aussi des informations sur les valeurs que tu prends pour "n" et "SMAP" et sur la maniere dont tu fais l'allocation.
manta7
Messages postés105Date d'inscriptionsamedi 25 janvier 2003StatutMembreDernière intervention13 décembre 2008 25 mai 2007 à 17:12
SMAP c'est la taille de la map, je l'utilise pour la structure map
n c'est l'indice pour la structure unite, c'est a dire qu'apres je l'utilise avec un classe[indice].unite[classe.n] pour connaitre ou se situe unite
En fait pour chaque classe il existe plusieurs unités, et mon realloc veut reallouer classe[indice].unite
En ce qui concerne affichage je m'en sert comme indice de classe et y'a jamais eu aucun souci.
Avant que je veuille reallouer classe[map[x][y].affichage].unite, celle ci fonctionne parfaitement d'ou ma "stupeur" quand je fais un simple realloc et meme quand je met une memoire au hasard (plus grande que celle requise)...
manta7
Messages postés105Date d'inscriptionsamedi 25 janvier 2003StatutMembreDernière intervention13 décembre 2008 25 mai 2007 à 17:53
classe c'est une structure globale
les allocations :
classe=malloc(sizeof(classe)*NCLASSE);
for(i=0;i<NCLASSE;i++)
{
classe[i].unite=malloc(sizeof(unite)*UNITE_PER_MAP);
etc..
}
n=4
SMAP=10
Vous n’avez pas trouvé la réponse que vous recherchez ?
#define SMAP 10 //Taille de la map
#define UNITE_PER_MAP 5 //Nombre d'unité par map
#define NTOUR 50 //Nombre de tour
#define DISTANCE_VUE 2 //Distance de la vision de U4 au départ
#define NFRUITS 5 //Nombre de fruits au départ de la map
#define NFRUITS_PER_TOUR 1 //Nombre de nouveaux fruits par tour
#define FRUITS_FOR_LIFE 5 //Nombre d'années de vie en plus pour un fruit
#define OUI 1
#define NON 0
#define VIDE -1
#define FRUITS -2
#define U0 0 //Préférence pour la droite
#define U1 1 //gauche
#define U2 2 //haut
#define U3 3 //bas
#define U4 4 //Regarde aux alentours
typedef struct _unite {
int
xright, yright, //Chance d'aller a droite
xleft, yleft, //gauche
xup, yup, //haut
xdown, ydown, //bas
xvue, yvue, //Chance de regarder aux alentours pour prendre
vietotale, viebase, vie;
}unite;
typedef struct _classe {
unite *unite;
int n; //Nombre d'unités par classe
}classe;
struct _map {
int affichage; //Affichage sur affiche()
int dejavu; //Permet de savoir si une unité a déja effectuée un tour
unite *unite;
int element; //Numero d'element dans unite[]
}map[SMAP][SMAP];
int NCLASSE=5; //Nombre des différentes espèces sur la map
/*----------------------------------------------------------------------------------------------------
Initialisation à chaque tour de la variable dejavu
----------------------------------------------------------------------------------------------------*/
void inittour(void)
{
int i, j;
for(i=0;i<SMAP;i++)
{
for(j=0;j<SMAP;j++)
map[i][j].dejavu=NON;
}
return;
}
/*----------------------------------------------------------------------------------------------------
Initialisation des classes
----------------------------------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------------------------------
Affiche la map
----------------------------------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------------------------------
Calcule la distance entre 2 points
----------------------------------------------------------------------------------------------------*/
int distance(int i, int j, int x, int y)
{
return abs(i-x)+abs(j-y);
}
/*----------------------------------------------------------------------------------------------------
L'action est de type vision
----------------------------------------------------------------------------------------------------*/
void vision(classe * classe, int x, int y)
{
int i, j;
for(i=0;i<SMAP;i++)
{
for(j=0;j<SMAP;j++)
{
if(distance(i, j, x, y)<=DISTANCE_VUE)
{
if(map[i][j].affichage==FRUITS)
{
map[x][y].unite[map[x][y].element].vie+=(FRUITS_FOR_LIFE+1);//On ajoute 1 pour ne pas perdre d'année de vie en mangeant un fruit
map[i][j].affichage=VIDE;
return;
}
}
}
}
return;
}
/*----------------------------------------------------------------------------------------------------
Teste s'il y a une place vide a coté de la mere ou du pere
----------------------------------------------------------------------------------------------------*/
int* placevide(int x, int y, int sx, int sy)
{
int *vide;
/*----------------------------------------------------------------------------------------------------
Deplacement avec test des cas possibles
----------------------------------------------------------------------------------------------------*/
void deplace(classe * classe, int x, int y, int sx, int sy)
{
if(map[sx][sy].affichage==VIDE) //Simple déplacement
{
map[sx][sy].affichage=map[x][y].affichage;
map[x][y].affichage=VIDE;
/*----------------------------------------------------------------------------------------------------
Action a effectuer d'une unité
----------------------------------------------------------------------------------------------------*/
void action(classe * classe, int i, int j)
{
int hasard, cas=1;
int x, y;
hasard = rand() % 101;
/*----------------------------------------------------------------------------------------------------
Fonction appelée a chaque tour
----------------------------------------------------------------------------------------------------*/
void tour(classe * classe)
{
int i, j;
int x,y;
inittour();
x = rand() % 101;
for(i=0;i<NFRUITS_PER_TOUR;i++)
{
x = rand() % SMAP;
y = rand() % SMAP;
if(map[x][y].affichage==VIDE) //On crée un nouveau fruit sur (x,y)
map[x][y].affichage=FRUITS;
else
i--;
}
The_Guardian
Messages postés317Date d'inscriptionvendredi 25 mai 2007StatutMembreDernière intervention19 octobre 20071 25 mai 2007 à 22:59
Deja j'aime assez comment tu codes. Sauf ta fonction initclasse
avec du code recopie 15 fois et pas de .h pas bien :)
quelle est la difference entre element et unite ? dans classe car a priori, unite c'est juste classe[element].unite
Le reste que je dirais c'est que le bug de ton realloc vient d'une segfault
mais en parcourant le code j'ai pas vu ou tu devrais analyser que tu n'as pas de debordements en commentant les fonctions et en revoyant tout notamment
je relirais ton code demain, à tête plus refaite :)
puis genre classe=realloc(classe, sizeof(classe)*++NCLASSE);
faut pas s'etonner... au pire si tu veux tu pourrais faire aussi des printf pour voir la valeur actuelle de unité et tout ca
bref
=
manta7
Messages postés105Date d'inscriptionsamedi 25 janvier 2003StatutMembreDernière intervention13 décembre 2008 26 mai 2007 à 00:50
Merci c'est sympa, mais c'est vrai que la fonction initclasse est affreuse.
J'ai pensé a améliorer la structure unité en enlevant toutes les variables xright, yright, xvue bla bla bla en seulement un tableau d'entier avec des constantes prédéfinies du genre qualite[DROIT]=100 comme ça dans initclasse j'utilise un for et ça simplifierai tout. J'aurai juste a tout reprendre dans mon programme :)
Par contre classe[element].unite comme tu l'as écrit ne fonctionnerai pas car element c'est l'indice de unite c'est plutot classe[affichage].unite[element].
Et pour mon probleme j'ai testé avec des printfs a priori j'ai tout qui fonctionne et qui fait ce dont j'ai envie avant le realloc donc je comprends pas d'ou ça peut venir...
Et puis au fait merci pour ton aide et promis je fais un header ;)
The_Guardian
Messages postés317Date d'inscriptionvendredi 25 mai 2007StatutMembreDernière intervention19 octobre 20071 26 mai 2007 à 13:21
RE
Que ca soit cette ligne qui merde, c'est pas obligatoire. Si c'est une segfault, ca peut venir de n'importe ou ailleurs et seulement se remarquer a cet endroit la, mais oui, je te proposerais de verifier que le premier argument est pas NULL avant de faire ton realloc
The_Guardian
Messages postés317Date d'inscriptionvendredi 25 mai 2007StatutMembreDernière intervention19 octobre 20071 26 mai 2007 à 13:54
Re
ben teste ?
Parce que tu t'en sers partout mais les parametres changent a chaque fois
et pour trouver des erreurs faut parfois tester et d'autres fois faut afficher les resultats.
manta7
Messages postés105Date d'inscriptionsamedi 25 janvier 2003StatutMembreDernière intervention13 décembre 2008 26 mai 2007 à 14:13
Je comprends pas je teste plusieurs parametres, je fais des printf, et meme un printf de l'adresse de ce que je veux reallouer, y'a tout qui marche, je comprends pas...
The_Guardian
Messages postés317Date d'inscriptionvendredi 25 mai 2007StatutMembreDernière intervention19 octobre 20071 26 mai 2007 à 15:08
RE
Bon, faut debugger, tu as un probleme qui va etre dur à trouver car ton code est assez gros et pas facile a lire.
Donc pour decouvrir ou ca plante, il faut que tu commentes tout ce qui est inutile jusqu'a n'avoir plus rien, puis tu remets au fur et a mesure les fonctions dont dependent ta fonction enfant
En mettant des printf("pointeur=%x\n", classe[...].unite); tu fais ca pour l'indice qui plante ca tu le connais avec des printf aussi et tu remontes l'erreur
Un programme vide ne plante pas!
Donc ton but est de trouver le plut petit programme qui va planter, et ca devrait aller une fois que tu as fait ca car l'erreur va etre evidente.
Je vois pas comment t'aider plus autrement, désolé.
NitRic
Messages postés402Date d'inscriptionmardi 1 mai 2001StatutMembreDernière intervention15 août 2011 26 mai 2007 à 20:15
un realloc() avec un pointeur NULL et une taille de zéro ou non est l'équivalent d'un malloc() ...
un realloc() avec un pointeur non NULL et une taille de zéro est l'équivalent à un free() ...
ce n'est pas conseillé mais on peut tout faire avec realloc()