Je suis en train de tenter, avec mes élèves, de faire une simulation de RPG (en mode texte/console sous Linux).
J'ai ce message qui survient, j'expliquerais la manière de reproduire ce message:
Je peux vous fournir le code d'où cette "exception" (grrr ! pas moyen de l'intercepter comme en OO) est "lancée", mais ne vous mettez pas à rigoler de ma caisse car je "joue avec le feu" dans cette partie de code.Citation:
rpg2014: malloc.c:2451:
sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) ||
((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) &
~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed
Avant de commence cette fonction j'ai pourtant réfléchi, j'ai essayé plein d'approches différentes, et aucune à part celle-ci m'a permis d'avancer.
Voici le concept: là aussi il y a matière à discuter mais bon...
J'ai une carte (une map) de 228 colonnes sur 48 lignes.
Notre plateau de jeu (affiché à l'écran) fait 80 colonnes sur 16 lignes.
L'idée est de pouvoir copier les éléments du fichier comme si une fenêtre "glissait" sur la carte et ne dévoilait que 80 colonnes et 16 lignes à la fois.
Ca fonctionne bien, j'en suis d'ailleurs très content, cependant, quand un obstacle se situe sur la dernière ligne d'une "fenêtre" et que le joueur cherche à changer de carte (sans "voir" l'obstacle de l'autre côté) il doit y avoir un avertissement indiquant qu'il ne peut pas changer de carte.
Mon idée était de changer de "fenêtre" (je charge dans ce qui représente "la fenêtre" les éléments issue de la carte à la position hypothétique du joueur) et si il n'y avait pas d'obstacles alors je considérais que la "nouvelle fenêtre" peut être affichée.
Dans le cas contraire, je restitue les données de "l'ancienne fenêtre".
Ca fonctionne... même mieux que ce que j'imaginais...
Cependant: si je ne suis pas en mode plein écran (???) et que je place mon joueur à un endroit à la limite supérieure d'une fenêtre où je sais que sur la "fenêtre du dessus" il y a des obstacles, et que je fais des essais successifs pour aller dans la direction des obstacles, au bout d'un moment j'obtiens ce message d'erreur.
Ca ne vous parlera peut-être pas...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 [1420625324.058053612][Wed Jan 7 11:08:44 2015] -------------------------------------------------------------------------------------- [1420625324.545795916][Wed Jan 7 11:08:44 2015] Ligne 01 --> [000000000000000000000000000000000000000000000000000000000000000000000000M00000000000000F] [1420625324.545916732][Wed Jan 7 11:08:44 2015] Ligne 02 --> [00000000000000000000000000000000000000000000000000000000000000000000M000M0000000000FFFFF] [1420625324.545963200][Wed Jan 7 11:08:44 2015] Ligne 03 --> [00000000000000000EEEEEEE00000000000000000000000000000000000000000000MMMMM00000000000FFFF] [1420625324.546023852][Wed Jan 7 11:08:44 2015] Ligne 04 --> [000000000000000000EEEEE000000000000000000000000000000000000000000000M000M0000000000FFFFF] [1420625324.546057113][Wed Jan 7 11:08:44 2015] Ligne 05 --> [00000000000000000EEEEEEEEE000000000000000000000000000000000000000000M000000000000000000F] [1420625324.546089885][Wed Jan 7 11:08:44 2015] Ligne 06 --> [0000000000000000000000EEE0000000000000000000000000000000000000000000M000M000000000000000] [1420625324.546122168][Wed Jan 7 11:08:44 2015] Ligne 07 --> [00000000000000000000000000000000000000000000000000000000000000000000MMM0M000000000000000] [1420625324.546154451][Wed Jan 7 11:08:44 2015] Ligne 08 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000] [1420625324.546187223][Wed Jan 7 11:08:44 2015] Ligne 09 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000] [1420625324.546219016][Wed Jan 7 11:08:44 2015] Ligne 10 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000] [1420625324.546251788][Wed Jan 7 11:08:44 2015] Ligne 11 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000] [1420625324.546283582][Wed Jan 7 11:08:44 2015] Ligne 12 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000] [1420625324.546315865][Wed Jan 7 11:08:44 2015] Ligne 13 --> [000000000000000000000000000000000000000MMMMMMMMMM000000000000000000000000000000000000000] [1420625324.546348637][Wed Jan 7 11:08:44 2015] Ligne 14 --> [000000000000000000000000000000000000000M00000000M000000000000000000000000000000000000000] [1420625324.546380920][Wed Jan 7 11:08:44 2015] Ligne 15 --> [000000000000000000000000000000000000000M00000000M000000000000000000000000000000000000000] [1420625324.546413202][Wed Jan 7 11:08:44 2015] Ligne 16 --> [000000000000000000000000000000000000000M00MMMMMMM000000000000000000000000000000000000000] [1420625324.546444018][Wed Jan 7 11:08:44 2015] -------------------------------------------------------------------------------------- [1420625324.546684182][Wed Jan 7 11:08:44 2015] Ligne 01 --> [000000000000000000000000000000000000000M00000000M000000000000000000000000000000000000000] [1420625324.546739454][Wed Jan 7 11:08:44 2015] Ligne 02 --> [000000000000000000000000000000000000000MMMMMMMM0M000000000000000000000000000000000000000] [1420625324.546772715][Wed Jan 7 11:08:44 2015] Ligne 03 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000] [1420625324.546804998][Wed Jan 7 11:08:44 2015] Ligne 04 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000] [1420625324.546837770][Wed Jan 7 11:08:44 2015] Ligne 05 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000] [1420625324.546870542][Wed Jan 7 11:08:44 2015] Ligne 06 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000] [1420625324.546903314][Wed Jan 7 11:08:44 2015] Ligne 07 --> [000000000000000000000000000000000EEEEEEE000000000000000000000000000000000000000000000000] [1420625324.546936086][Wed Jan 7 11:08:44 2015] Ligne 08 --> [0000000000000000000000000000000000000EEEEEEE00000000000000000000000000000000000000000000] [1420625324.546968368][Wed Jan 7 11:08:44 2015] Ligne 09 --> [0000000000000000000000000000000000EEEEEEE00EEEEEEE00000000000000000000000000000000000000] [1420625324.547001140][Wed Jan 7 11:08:44 2015] Ligne 10 --> [0000000000000000000000000000000EEEEEEE00000000EEEEEEE00000000000000000000000000000000000] [1420625324.547033912][Wed Jan 7 11:08:44 2015] Ligne 11 --> [000000000000000000000000000000000000EEEEEEE000000000000000000000000000000000000000000000] [1420625324.547066195][Wed Jan 7 11:08:44 2015] Ligne 12 --> [000000000000000000000000000000000EEEEEEE000000000000000000000000000000000000000000000000] [1420625324.547098967][Wed Jan 7 11:08:44 2015] Ligne 13 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000] [1420625324.547145924][Wed Jan 7 11:08:44 2015] Ligne 14 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000] [1420625324.547178696][Wed Jan 7 11:08:44 2015] Ligne 15 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000] [1420625324.547211468][Wed Jan 7 11:08:44 2015] Ligne 16 --> [VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV] [1420625324.547242283][Wed Jan 7 11:08:44 2015] -------------------------------------------------------------------------------------- [1420625325.110275422][Wed Jan 7 11:08:45 2015] Ligne 01 --> [000000000000000000000000000000000000000000000000000000000000000000000000M00000000000000F] [1420625325.110391346][Wed Jan 7 11:08:45 2015] Ligne 02 --> [00000000000000000000000000000000000000000000000000000000000000000000M000M0000000000FFFFF] [1420625325.110426075][Wed Jan 7 11:08:45 2015] Ligne 03 --> [00000000000000000EEEEEEE00000000000000000000000000000000000000000000MMMMM00000000000FFFF] [1420625325.110458358][Wed Jan 7 11:08:45 2015] Ligne 04 --> [000000000000000000EEEEE000000000000000000000000000000000000000000000M000M0000000000FFFFF] [1420625325.110516075][Wed Jan 7 11:08:45 2015] Ligne 05 --> [00000000000000000EEEEEEEEE000000000000000000000000000000000000000000M000000000000000000F]
Ci-dessus vous avez le log de ce qu'il se passe dans le code de la fonction qui me pose soucis...
Le joueur se trouve en-dessous des 'M' de la ligne 16.
Si je vais dans la direction du Nord (UP au clavier) mon programme ne change pas de "fenêtre" mais dans ma fonction, la "fenêtre" qui devrait être affichée si il n'y avait pas d'obstacle est bien chargée en mémoire... ceci pour vérifier qu'il n'y a pas d'obstacles à la progression
du joueur justement.
La fonction ne "se plante" pas de suite, si on ne fait qu'un seul essai, le programme continue de fonctionner normalement, par contre si je fais deux ou trois essais successifs, au bout d'un moment la fonction se plante au niveau de la fonction malloc() qui est utilisée...
Dans le log, dans ce cas-ci c'est quand on passe à la sixième ligne, mais cela dépend de la taille de la fenêtre de la console... c'est vraiment aléatoire, en mode plein écran cela n'arrive pas.
Je laisse mon doigt appuyé sur la touche "UP" du clavier et la fonction setWindow() ne se "plante" jamais (????)
Je pense, mais je n'en sais rien du tout, que le "switch trop rapide" entre la "fenêtre du dessous" et la "fenêtre du dessus" serait la source du "plantage" de malloc().
Cependant, je n'arrive pas à expliquer pourquoi en mode plein écran je n'arrive pas à reproduire les symptômes... pourtant la taille de la "fenêtre" est plus importante, il y a plus de données à manipuler.
Voici l'extrait (de l'horreur) de la fonction d'où provient le soucis...
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93 void setWindow(t_Map *LaCarte,t_WindowMap *target,int posXCourante,int posYCourante) { // *********************************************************************************************************************************************************** // setWindow est utilisée par plusieurs processus (thread d'affichage, thread de gestion clavier, thread des ennemis) // il se peut qu'il y ait une "race condition" --> section critique pour chaque appel de cette fonction dans chacun des threads... // *********************************************************************************************************************************************************** #define LOGON #ifdef LOGON char Debug[target->Colonnes*2]; FILE *ptrDebug; #endif int cpt; int LignesCarte; char tmpTab[target->Lignes][target->Colonnes+1]; target->status=false; #ifdef LOGON ptrDebug=fopen("logs/setWindowdebug.log","a+t"); if(ptrDebug!=NULL) { #endif if(posYCourante>LaCarte->m_max_Y || posXCourante>LaCarte->m_max_X) { //Log(ptrDebug,"Hors des limites !!"); target->m_ptr=NULL; return; } //sprintf(Debug,"Position courante (%02d,%02d)",posXCourante,posYCourante); //Log(ptrDebug,Debug); if(LaCarte->m_ptr!=NULL) { for(cpt=0,LignesCarte=posYCourante;cpt<target->Lignes && LignesCarte<LaCarte->m_max_Y;cpt++,LignesCarte++) { memset(tmpTab[cpt],0,target->Colonnes+1); strncpy(tmpTab[cpt],*((LaCarte->m_ptr)+LignesCarte)+posXCourante,target->Colonnes+1); tmpTab[cpt][target->Colonnes+1]='\0'; *((target->m_ptr)+cpt)=(char*)malloc(sizeof(char)*target->Colonnes+1); memset(*((target->m_ptr)+cpt),0,sizeof(char)*target->Colonnes+1); strcpy(*((target->m_ptr)+cpt),tmpTab[cpt]); #ifdef LOGON sprintf(Debug,"Ligne %02d --> [%s]",cpt+1,*((target->m_ptr)+cpt)); Log(ptrDebug,Debug); #endif } if(cpt<target->Lignes) { for(LignesCarte=target->Lignes-1;LignesCarte>=cpt;LignesCarte--) { memset(tmpTab[LignesCarte],0,target->Colonnes+1); tmpTab[LignesCarte][target->Colonnes+1]='\0'; *((target->m_ptr)+LignesCarte)=(char*)malloc(sizeof(char)*target->Colonnes+1); memset(*((target->m_ptr)+LignesCarte),0,sizeof(char)*target->Colonnes+1); strcpy(*((target->m_ptr)+LignesCarte),tmpTab[LignesCarte]); } } } #ifdef LOGON } //target->Lignes=cpt; memset(Debug,'-',target->Colonnes-1); Debug[target->Colonnes-1]='\0'; Log(ptrDebug,Debug); fflush(ptrDebug); // éviter que la taille du fichier ne soit trop importante (c'est bien de débugger mais il faut pas que ça plante tout non plus... sur Linux aucun soucis, mais sur Windows...) long taille; fseek(ptrDebug,0L,SEEK_END); taille=ftell(ptrDebug); if(taille/1024L>1024L) { fclose(ptrDebug); remove("logs/setWindowdebug.log"); } else fclose(ptrDebug); #endif target->status=true; }