Accueil > Forum > > > > Probleme avec un realloc
Probleme avec un realloc
vendredi 25 mai 2007 à 16:38:09 |
Probleme avec un realloc

manta7
|
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 classe[map[x][y].affichage].unite=realloc(classe[map[x][y].affichage].unite, sizeof(unite)*(classe[map[x][y].affichage].n)); 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. Il me met *** glibc detected *** ./test: realloc(): invalid pointer: 0x0804c020 *** ======= Backtrace: ========= /lib/tls/i686/cmov/libc.so.6(realloc+0x392)[0xb7ed9322] /lib/tls/i686/cmov/libc.so.6[0xb7ed9461] /lib/tls/i686/cmov/libc.so.6(realloc+0x3c)[0xb7ed8fcc] ./test[0x8049eff] ./test[0x804a225] ./test[0x804a69b] ./test[0x804a8e6] ./test[0x804a975] /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xdc)[0xb7e83ebc] ./test[0x80484b1] ======= Memory map: ======== 08048000-0804b000 r-xp 00000000 08:01 7700495 /home/manta/programmation/c/projet/evolution/test 0804b000-0804c000 rw-p 00003000 08:01 7700495 /home/manta/programmation/c/projet/evolution/test 0804c000-0806d000 rw-p 0804c000 00:00 0 [heap] b7e6d000-b7e6e000 rw-p b7e6d000 00:00 0 b7e6e000-b7fa9000 r-xp 00000000 08:01 9535640 /lib/tls/i686/cmov/libc-2.5.so b7fa9000-b7faa000 r--p 0013b000 08:01 9535640 /lib/tls/i686/cmov/libc-2.5.so b7faa000-b7fac000 rw-p 0013c000 08:01 9535640 /lib/tls/i686/cmov/libc-2.5.so b7fac000-b7faf000 rw-p b7fac000 00:00 0 b7fb3000-b7fbe000 r-xp 00000000 08:01 9535502 /lib/libgcc_s.so.1 b7fbe000-b7fbf000 rw-p 0000a000 08:01 9535502 /lib/libgcc_s.so.1 b7fbf000-b7fc3000 rw-p b7fbf000 00:00 0 b7fc3000-b7fdc000 r-xp 00000000 08:01 9535503 /lib/ld-2.5.so b7fdc000-b7fde000 rw-p 00019000 08:01 9535503 /lib/ld-2.5.so bfe43000-bfe58000 rw-p bfe43000 00:00 0 [stack] ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso] Abandon (core dumped) (je compile avec gcc) Voila j'espere que vous avez une réponse :(
|
|
vendredi 25 mai 2007 à 17:06:05 |
Re : Probleme avec un realloc

The_Guardian
|
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.
===
|
|
vendredi 25 mai 2007 à 17:12:07 |
Re : Probleme avec un realloc

manta7
|
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)...
|
|
vendredi 25 mai 2007 à 17:22:35 |
Re : Probleme avec un realloc

The_Guardian
|
RE
tu reponds pas a ma question en fait : n = ? SMAP = ? ou est declaree "classe" ? et passe aussi le code ou tu fais ton malloc
===
|
|
vendredi 25 mai 2007 à 17:53:06 |
Re : Probleme avec un realloc

manta7
|
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
|
|
vendredi 25 mai 2007 à 18:35:47 |
Re : Probleme avec un realloc

The_Guardian
|
Ca serait bien de voir ton code, et pas que le .h car la segfault se trouve dans le .c
Ainsi on ne peut pas te repondre vraiment, tu vois.
===
|
|
vendredi 25 mai 2007 à 18:38:24 |
Re : Probleme avec un realloc

manta7
|
Pourquoi pas :) mais j'ai pas encore fait de .h j'attendais de terminer les fonctions d'initialisations ce que j'ai fait aujourd'hui.
C'est dans la fonction enfant() que le realloc pose probleme
#include <stdio.h> #include <stdlib.h> #include <time.h>
#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 ----------------------------------------------------------------------------------------------------*/ classe* initclasse(void) { int i, j; classe* classe; classe=malloc(sizeof(classe)*NCLASSE); for(i=0;i<NCLASSE;i++) { classe[i].unite=malloc(sizeof(unite)*UNITE_PER_MAP); for(j=0;j<UNITE_PER_MAP;j++) { if(i==U0) { classe[i].unite[j].xright=0; classe[i].unite[j].yright=100; classe[i].unite[j].xleft=classe[i].unite[j].xup=classe[i].unite[j].xdown=classe[i].unite[j].yleft=classe[i].unite[j].yup=classe[i].unite[j].ydown=0; classe[i].unite[j].xvue=classe[i].unite[j].yvue=0; classe[i].unite[j].vie=10; classe[i].unite[j].viebase=10; classe[i].unite[j].vietotale=0; } else if(i==U1) { classe[i].unite[j].xleft=0; classe[i].unite[j].yleft=100; classe[i].unite[j].xright=classe[i].unite[j].xup=classe[i].unite[j].xdown=classe[i].unite[j].yright=classe[i].unite[j].yup=classe[i].unite[j].ydown=0; classe[i].unite[j].xvue=classe[i].unite[j].yvue=0; classe[i].unite[j].vie=10; classe[i].unite[j].viebase=10; classe[i].unite[j].vietotale=0; } else if(i==U2) { classe[i].unite[j].xup=0; classe[i].unite[j].yup=100; classe[i].unite[j].xleft=classe[i].unite[j].xright=classe[i].unite[j].xdown=classe[i].unite[j].yleft=classe[i].unite[j].yright=classe[i].unite[j].ydown=0; classe[i].unite[j].xvue=classe[i].unite[j].yvue=0; classe[i].unite[j].vie=10; classe[i].unite[j].viebase=10; classe[i].unite[j].vietotale=0; } else if(i==U3) { classe[i].unite[j].xdown=0; classe[i].unite[j].ydown=100; classe[i].unite[j].xleft=classe[i].unite[j].xup=classe[i].unite[j].xright=classe[i].unite[j].yleft=classe[i].unite[j].yup=classe[i].unite[j].yright=0; classe[i].unite[j].xvue=classe[i].unite[j].yvue=0; classe[i].unite[j].vie=10; classe[i].unite[j].viebase=10; classe[i].unite[j].vietotale=0; } else if(i==U4) { classe[i].unite[j].xleft=classe[i].unite[j].xup=classe[i].unite[j].xright=classe[i].unite[j].yleft=classe[i].unite[j].yup=classe[i].unite[j].yright=0; classe[i].unite[j].xdown=classe[i].unite[j].ydown=0; classe[i].unite[j].xvue=0; classe[i].unite[j].yvue=100; classe[i].unite[j].vie=20; classe[i].unite[j].viebase=20; classe[i].unite[j].vietotale=0; } classe[i].n=UNITE_PER_MAP; } } return classe; }
/*---------------------------------------------------------------------------------------------------- Initialisation de la map de départ ----------------------------------------------------------------------------------------------------*/ void initmap(classe * classe) { int i, j; int x,y; //On initialise chaque case a VIDE for(i=0;i<SMAP;i++) { for(j=0;j<SMAP;j++) { map[i][j].affichage=VIDE; map[i][j].unite=NULL; map[i][j].element=0; } } //On s'occupe des unités for(i=0;i<NCLASSE;i++) { for(j=0;j<UNITE_PER_MAP;j++) { x = rand() % SMAP; y = rand() % SMAP; if(map[x][y].affichage==VIDE) //On crée une nouvelle unité sur (x,y) { map[x][y].unite=classe[i].unite; map[x][y].element=j; map[x][y].affichage=i; } else j--; } } //On s'occupe des fruits for(i=0;i<NFRUITS;i++) { x = rand() % SMAP; y = rand() % SMAP; if(map[x][y].affichage==VIDE) map[x][y].affichage=FRUITS; else i--; } //printf("%d %d\n",map[0][0].affichage, map[0][0].unite[0].vie); return; } /*---------------------------------------------------------------------------------------------------- On regarde s'il y a encore des unités vivantes ----------------------------------------------------------------------------------------------------*/
int apocalypse(void) { int i, j; for(i=0;i<SMAP;i++) { for(j=0;j<SMAP;j++) { if(map[i][j].affichage>=0) return NON; } } return OUI; } /*---------------------------------------------------------------------------------------------------- Affiche la map ----------------------------------------------------------------------------------------------------*/ void affiche() { int i, j; for(i=0;i<SMAP;i++) { for(j=0;j<SMAP;j++) { if(map[i][j].affichage>=0 && map[i][j].affichage<=9) //printf(" %d ", map[i][j].affichage); printf(" %d ",map[i][j].unite[map[i][j].element].vie); else printf("%d ",map[i][j].affichage); } printf("\n"); } return; }
/*---------------------------------------------------------------------------------------------------- Valeur absolue ----------------------------------------------------------------------------------------------------*/ int abs(int x) { if(x<0) return -x; else return x; } /*---------------------------------------------------------------------------------------------------- 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; vide=malloc(sizeof(int)*3); if(y!=SMAP-1 && map[x][y+1].affichage==VIDE) { vide[0]=1; vide[1]=x; vide[2]=y+1; } else if(y!=0 && map[x][y-1].affichage==VIDE) { vide[0]=1; vide[1]=x; vide[2]=y-1; } else if(x!=SMAP-1 && map[x+1][y].affichage==VIDE) { vide[0]=1; vide[1]=x+1; vide[2]=y; } else if(x!=0 && map[x-1][y].affichage==VIDE) { vide[0]=1; vide[1]=x-1; vide[2]=y; } else if(sy!=SMAP-1 && map[sx][sy+1].affichage==VIDE) { vide[0]=1; vide[1]=sx; vide[2]=sy+1; } else if(sy!=0 && map[sx][sy-1].affichage==VIDE) { vide[0]=1; vide[1]=sx; vide[2]=sy+1; } else if(sx!=SMAP-1 && map[sx+1][sy].affichage==VIDE) { vide[0]=1; vide[1]=sx; vide[2]=sy+1; } else if(sx!=0 && map[sx-1][sy].affichage==VIDE) { vide[0]=1; vide[1]=sx; vide[2]=sy+1; } else vide[0]=0; return vide; } /*---------------------------------------------------------------------------------------------------- Evolution ----------------------------------------------------------------------------------------------------*/ void evolution(classe * classe, int x, int y, int sx, int sy) { int cdroit, cgauche, chaut, cbas, cvue, cvie; int *vide; vide=placevide(x,y,sx,sy); if(vide[0]) { cdroit=(map[x][y].unite[map[x][y].element].yright-map[x][y].unite[map[x][y].element].xright+map[sx][sy].unite[map[sx][sy].element].yright-map[sx][sy].unite[map[sx][sy].element].xright)/2; cgauche=(map[x][y].unite[map[x][y].element].yleft-map[x][y].unite[map[x][y].element].xleft+map[sx][sy].unite[map[sx][sy].element].yleft-map[sx][sy].unite[map[sx][sy].element].xleft)/2; chaut=(map[x][y].unite[map[x][y].element].yup-map[x][y].unite[map[x][y].element].xup+map[sx][sy].unite[map[sx][sy].element].yup-map[sx][sy].unite[map[sx][sy].element].xup)/2; cbas=(map[x][y].unite[map[x][y].element].ydown-map[x][y].unite[map[x][y].element].xdown+map[sx][sy].unite[map[sx][sy].element].ydown-map[sx][sy].unite[map[sx][sy].element].xdown)/2; cvue=(map[x][y].unite[map[x][y].element].yvue-map[x][y].unite[map[x][y].element].xvue+map[sx][sy].unite[map[sx][sy].element].yvue-map[sx][sy].unite[map[sx][sy].element].xvue)/2; cvie=(map[x][y].unite[map[x][y].element].viebase-map[sx][sy].unite[map[sx][sy].element].viebase)/2; classe=realloc(classe, sizeof(classe)*++NCLASSE); classe[NCLASSE-1].unite=malloc(sizeof(unite)*1); classe[NCLASSE-1].n=1; classe[NCLASSE-1].unite[0].xright=0; classe[NCLASSE-1].unite[0].yright=cdroit; classe[NCLASSE-1].unite[0].xleft=cdroit; classe[NCLASSE-1].unite[0].yleft=cdroit+cgauche; classe[NCLASSE-1].unite[0].xup=cdroit+cgauche; classe[NCLASSE-1].unite[0].yup=cdroit+cgauche+chaut; classe[NCLASSE-1].unite[0].xdown=cdroit+cgauche+chaut; classe[NCLASSE-1].unite[0].ydown=cdroit+cgauche+chaut+cbas; classe[NCLASSE-1].unite[0].xvue=cdroit+cgauche+chaut+cbas; classe[NCLASSE-1].unite[0].yvue=100; classe[NCLASSE-1].unite[0].vie=cvie; classe[NCLASSE-1].unite[0].viebase=cvie; classe[NCLASSE-1].unite[0].vietotale=0; map[vide[1]][vide[2]].affichage=NCLASSE-1; map[vide[1]][vide[2]].dejavu=OUI; map[vide[1]][vide[2]].unite=classe[NCLASSE-1].unite; map[vide[1]][vide[2]].element=0; } return; }
/*---------------------------------------------------------------------------------------------------- Enfant ----------------------------------------------------------------------------------------------------*/ void enfant(classe * classe, int x, int y, int sx, int sy) { int *vide; vide=placevide(x,y,sx,sy);printf("enfant %d %d %d %d, %d %d %d, %d %d\n%d %d\n",x,y,sx,sy, vide[0], vide[1], vide[2],classe[map[x][y].affichage].n,map[x][y].affichage,sizeof(unite),sizeof(unite)*(classe[map[x][y].affichage].n)); if(vide[0]) { classe[map[x][y].affichage].n++; classe[map[x][y].affichage].unite=realloc(classe[map[x][y].affichage].unite, sizeof(unite)*(classe[map[x][y].affichage].n)); //classe[map[x][y].affichage].unite=realloc( NULL, 300 ); /*map[vide[1]][vide[2]].affichage=map[x][y].affichage; map[vide[1]][vide[2]].dejavu=OUI; map[vide[1]][vide[2]].unite=classe[map[x][y].affichage].unite; map[vide[1]][vide[2]].element=classe[map[x][y].affichage].n-1; /*map[vide[1]][vide[2]].unite[ map[vide[1]][vide[2]].element ].vie=classe[map[x][y].affichage].unite[map[x][y].affichage].vie; map[vide[1]][vide[2]].unite[ map[vide[1]][vide[2]].element ].viebase=classe[map[x][y].affichage].unite[map[x][y].affichage].viebase; map[vide[1]][vide[2]].unite[ map[vide[1]][vide[2]].element ].vietotale=classe[map[x][y].affichage].unite[map[x][y].affichage].vietotale; map[vide[1]][vide[2]].unite[ map[vide[1]][vide[2]].element ].xright=classe[map[x][y].affichage].unite[map[x][y].affichage].xright; map[vide[1]][vide[2]].unite[ map[vide[1]][vide[2]].element ].yright=classe[map[x][y].affichage].unite[map[x][y].affichage].yright; map[vide[1]][vide[2]].unite[ map[vide[1]][vide[2]].element ].xleft=classe[map[x][y].affichage].unite[map[x][y].affichage].xleft; map[vide[1]][vide[2]].unite[ map[vide[1]][vide[2]].element ].yleft=classe[map[x][y].affichage].unite[map[x][y].affichage].yleft; map[vide[1]][vide[2]].unite[ map[vide[1]][vide[2]].element ].xup=classe[map[x][y].affichage].unite[map[x][y].affichage].xup; map[vide[1]][vide[2]].unite[ map[vide[1]][vide[2]].element ].yup=classe[map[x][y].affichage].unite[map[x][y].affichage].yup; map[vide[1]][vide[2]].unite[ map[vide[1]][vide[2]].element ].xdown=classe[map[x][y].affichage].unite[map[x][y].affichage].xdown; map[vide[1]][vide[2]].unite[ map[vide[1]][vide[2]].element ].xup=classe[map[x][y].affichage].unite[map[x][y].affichage].xup;*/ } //classe[i].unite=malloc(sizeof(unite)*UNITE_PER_MAP); return; } /*---------------------------------------------------------------------------------------------------- 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; map[sx][sy].unite=map[x][y].unite; map[x][y].unite=NULL; map[sx][sy].element=map[x][y].element; map[x][y].element=0; } else if(map[sx][sy].affichage==FRUITS) //Manger { map[sx][sy].affichage=map[x][y].affichage; map[x][y].affichage=VIDE; map[sx][sy].unite=map[x][y].unite; map[x][y].unite=NULL; map[sx][sy].element=map[x][y].element; map[x][y].element=0; map[sx][sy].unite[map[sx][sy].element].vie+=(FRUITS_FOR_LIFE+1); } else //Evolution ou enfant { if(map[x][y].affichage != map[sx][sy].affichage) //Evolution ;//evolution(classe, x, y, sx, sy); else //Enfant enfant(classe, x, y, sx, sy); } printf("%d %d %d %d %d %d\n",x,y,sx,sy,map[sx][sy].affichage, map[sx][sy].unite[map[sx][sy].element].vie); return; }
/*---------------------------------------------------------------------------------------------------- Action a effectuer d'une unité ----------------------------------------------------------------------------------------------------*/ void action(classe * classe, int i, int j) { int hasard, cas=1; int x, y; hasard = rand() % 101; if(hasard>=map[i][j].unite[map[i][j].element].xleft && hasard <=map[i][j].unite[map[i][j].element].yleft) { x=i; y=j-1; } else if(hasard>=map[i][j].unite[map[i][j].element].xright && hasard <=map[i][j].unite[map[i][j].element].yright) { x=i; y=j+1; } else if(hasard>=map[i][j].unite[map[i][j].element].xup && hasard <=map[i][j].unite[map[i][j].element].yup) { x=i-1; y=j; } else if(hasard>=map[i][j].unite[map[i][j].element].xdown && hasard <=map[i][j].unite[map[i][j].element].ydown) { x=i+1; y=j; } else if(hasard>=map[i][j].unite[map[i][j].element].xvue && hasard <=map[i][j].unite[map[i][j].element].yvue) cas=0; else return; //Parfois tout ces cas ne sont pas pris en compte, pourquoi ? if(cas==0) vision(classe,i,j); else { if(x==-1) x=SMAP-1; if(y==-1) y=SMAP-1; if(x==SMAP) x=0; if(y==SMAP) y=0; if(map[x][y].dejavu==NON && x>=0 && x<SMAP && y>=0 && y<SMAP) { deplace(classe, i, j, x, y); map[x][y].dejavu=OUI; } } return; } /*---------------------------------------------------------------------------------------------------- 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--; } for(i=0;i<SMAP;i++) { for(j=0;j<SMAP;j++) { if(map[i][j].dejavu==NON && map[i][j].affichage>=0) { if(map[i][j].unite[map[i][j].element].vie<=0) map[i][j].affichage=VIDE; else { map[i][j].unite[map[i][j].element].vie--; action(classe, i, j); map[i][j].dejavu=OUI; } } } } } /*---------------------------------------------------------------------------------------------------- Ce bon vieux main() ----------------------------------------------------------------------------------------------------*/ int main() { int i; classe * classe; srand(time(0)); //Initialisation classe=initclasse(); initmap(classe); affiche(); getchar(); while(!apocalypse()) { tour(classe); affiche(); getchar(); } printf("APOCALYPSE\n\n");
return 0; }
|
|
vendredi 25 mai 2007 à 22:59:37 |
Re : Probleme avec un realloc

The_Guardian
|
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 ===
|
|
samedi 26 mai 2007 à 00:50:24 |
Re : Probleme avec un realloc

manta7
|
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 ;)
|
|
samedi 26 mai 2007 à 10:12:30 |
Re : Probleme avec un realloc

The_Guardian
|
RE
Je me demande si tu n'es pas en train de faire un realloc sur du NULL ?
|
|
Cette discussion est classée dans : rw, lib, unite, realloc, libc
Répondre à ce message
Sujets en rapport avec ce message
Probleme de fichier [ par manta7 ]
Salut à tous !J'ai une erreur récurrente que ne me permet pas de faire plus de 4096 fprintf dans un fichier :Je fais un :if( (F1=fopen("sortie", "w"))
winSock sous VC 6 [ par Vlad Mortelame ]
BonjourJ'ai fait un programme de serveur ( avec #include ) dont j'arriver à compiller sous DEV C++ (en ajoutant la librairie). Cependant je voudrais
Installation de la SDL avec MVS standard 2005 [ par Hatchepsut ]
Bonjour. Comme l'indique le titre, je n'arrive pas à installer la SDL. J'ai lu, relu, et re-relu tous les tutoriaux de multiples forums, rien n'y fai
probleme avec les maps [ par mobouel2002 ]
bonjour, j'ai une erreur de compilation, qui m'affiche ces erreurs : /usr/lib/gcc/i686-pc-l
dll compil avec vc++2005 fonctionne, mais pas si compil avec vc++2008 [ par zozizozu ]
Bonjour a tous, et desolé, c'est surement tres simple, mais ça fait 3 jours que je cherche et je ne trouve pas .Ma dll compillée avec vc++2005 fonctio
Utilisation de DirectInput pour un joystick [ par nono1928 ]
Bonjour à tous, voilà ça fait plusieurs heures que je bloque sur un pb, j'imagine que la réponse est simple mais comme je suis débutant... J'essaie de
realloc [ par yffff24 ]
Bonjour,Voila j'ai un petit problème en C lors de l'allocation d'un tableau. Je dois reallouer un tableaux à deux dimenssion dans une fonction seconda
#pragma comment(lib,"ws2_32.lib")//tjs pour les sockets [ par sab2bou ]
Bonjour,sous Windows XP SP2 et avec le compilateur C++ de Bloodshed,la ligne suivante provoque une erreur au link :#pragma comment(lib,"ws2_32.lib")
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|