System error: allocation dynamique de tableau
Posté le 31/07/2017 19:21
Bonjour,
Alors voilà j'ai un beau system error lorsque je fais tourner ce code:
int *m_prevL_x=NULL;
int *m_prevL_y=NULL;
int m_lenPrevL=0;
int count=0;
for(int k=0; k<3; k++)
{
m_lenPrevL = 0;
free(m_prevL_x);
free(m_prevL_y);
while(IsKeyUp(KEY_CTRL_EXIT) && !piafOut(piaf) && !piaf.isStop())
{
count++;
if(count>STEP_PATH*2)
{
count=0;
m_lenPrevL++;
m_prevL_x = (int *)realloc(m_prevL_x, m_lenPrevL*sizeof(int));
m_prevL_y = (int *)realloc(m_prevL_y, m_lenPrevL*sizeof(int));
if(m_prevL_x==NULL || m_prevL_y==NULL)
{
m_lenPrevL = 0;
free(m_prevL_x);
free(m_prevL_y);
}
else
{
m_prevL_x[m_lenPrevL-1] = INT(piaf.get_x());
m_prevL_y[m_lenPrevL-1] = INT(piaf.get_y());
}
}
ML_clear_vram();
draw(); // Appel des tableaux mais pas de problemes de ce cote la
piaf.draw(m_ScrMX, m_ScrMY, m_zoom);
ML_display_vram();
}
}
La partie problèmatique permet de sauvegarder les coordonées du piaf dans le tableau à un certain temps.
J'ai donc une erreur avec une cible proche de zero voir égale à zero, qui n'arrive pas lors de la premiere boucle for, mais plutôt dans les suivantes (seconde ou troisième) pour la sauvegarde du premier point.
Citer : Posté le 31/07/2017 19:28 | #
Pour qu'on puisse mieux t'aider il nous faudrait la ligne exacte (une petite recherche binaire et c'est bon), et si possible la fonction exacte qui cause le problème. En sachant exactement qu'est ce qui produit le problème tu pourras peut être même t'en rendre compte tout seul
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 31/07/2017 19:34 | #
Normalement libérer un pointeur nul est safe, mais je ne sais jamais trop pour le SDK. Par sécurité, au début de la première boucle :
if(m_prevL_y) free(m_prevL_y);
Par ailleurs, realloc() libère les anciens pointeurs pour toi, sauf si la réallocation échoue. Il faut donc garder deux variables pour ne pas causer de fuites de mémoire en cas d'échec. Ensuite, si realloc() échoue je suggérerais encore de ne pas libérer les pointeurs nuls.
Le problème n'est pas là, cependant. C'est plutôt le fait que tu libères les deux pointeurs au début de la boucle extérieure, et ensuite tu tentes de les réallouer alors qu'ils ont été libérés - ce n'est bien sûr pas possible.
Citer : Posté le 31/07/2017 19:38 | #
Zezombye: C'est à dire recherche binaire ?
Lephenixnoir: Dac pour les realloc. Mais pourquoi faire une realloc sur un pointeur qu'on a libéré est problématique ? Normalement si on donne un pointeur nul à realloc, la fonction se comporte comme malloc non ?
Citer : Posté le 31/07/2017 19:44 | #
Tu prends la moitié de ton code, tu le commentes, et si le bug est toujours là tu prends la moitié du code qui reste, tu le commentes, etc jusqu'à trouver la ou les lignes problématiques
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 31/07/2017 19:45 | #
Ah binaire dans ce sens là ^^' je croyais qu'il y avait un tricks à faire
Oui mais je peux pas non plus diminuer plus que ça
Ajouté le 31/07/2017 à 19:51 :
Ah oui non ok autant pour moi pour ce qui est de free, merci
Citer : Posté le 31/07/2017 20:36 | #
Libérer un pointeur ne le rend pas nul !
Ça marcherait si tu changeais la valeur des pointeurs libérés, mais là ils continuent de pointeur sur une zone que realloc() considère valide (car pointeur non nul) alors qu'en fait elle ne l'est plus.