Seuls les membres ayant 30 points peuvent parler sur le chat.

Forum Casio - Autres questions


Index du Forum » Autres questions » System error: allocation dynamique de tableau
Theprog Hors ligne Membre Points: 1447 Défis: 20 Message

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.


Zezombye Hors ligne Rédacteur Points: 1715 Défis: 13 Message

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
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Lephenixnoir Hors ligne Administrateur Points: 18201 Défis: 142 Message

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_x) free(m_prevL_x);
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.
Theprog Hors ligne Membre Points: 1447 Défis: 20 Message

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 ?
Zezombye Hors ligne Rédacteur Points: 1715 Défis: 13 Message

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
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Theprog Hors ligne Membre Points: 1447 Défis: 20 Message

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
Lephenixnoir Hors ligne Administrateur Points: 18201 Défis: 142 Message

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.

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
Pour coloriser votre code, cliquez ici.
Sinon cliquez sur le bouton ci-dessous.
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2020 | Il y a 30 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd