#0 

10-06-2009 19:46:01

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

Hello,
J'aurrai souhaité savoir si d'autre avaient eu un souci avec les core::array sur la méthode ArrayType.erase(int Index) ?
Visiblement ça delete pas correctement, j'arrive pas à trouver ce qui cloche, mais tout mon code est foutu en l'air avec ça smile.


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#1 

10-06-2009 20:04:03

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Copland :

Hello,
J'aurrai souhaité savoir si d'autre avaient eu un souci avec les core::array sur la méthode ArrayType.erase(int Index) ?


Je n'utilise pas plus que cela ces fonctions. Il s'agit de ce code ?

Code:

    //! Erases an element from the array.
    /** May be slow, because all elements following after the erased
    element have to be copied.
    \param index: Index of element to be erased. */
    void erase(u32 index)
    {
        _IRR_DEBUG_BREAK_IF(index>=used) // access violation

        for (u32 i=index+1; i<used; ++i)
        {
            allocator.destruct(&data[i-1]);
            allocator.construct(&data[i-1], data[i]); // data[i-1] = data[i];
        }

        allocator.destruct(&data[used-1]);

        --used;
    }

Force et sagesse...

Hors ligne


#2 

10-06-2009 20:06:49

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

En fait ça semble plustôt lié au ArrayType.clear(), mais je comprends pas ou ça déconne avant ça marchais nickel mon code.

Code:

void CShadowSceneNode::RemoveAllShadowToNode()
{
    for (u32 i=0;i<NodeList.size();++i)
    {
        NodeList[i].Enable = false;
        NodeList.erase(i);
    }
    NodeList.clear();
}

Si j'utilise le clear, ça fait n'importe quoi dans la liste, elle est erronnée, si je commente le clear tout fonctionne à parament....


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#3 

10-06-2009 20:38:14

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Si tu écris cela, est-ce que cela n'est pas mieux ?

Code:

void CShadowSceneNode::RemoveAllShadowToNode()
{
    for (u32 i=0;i<NodeList.size();++i)
    {
        NodeList[i].Enable = false;
    }
    NodeList.clear();
}

voir plus simplement encore

Code:

void CShadowSceneNode::RemoveAllShadowToNode()
{
    NodeList.clear();
}

dans la mesure ou tes élément de la liste sont détruit, faire un NodeList[i].Enable = false; ne sert pas à grand choses, non ?


Force et sagesse...

Hors ligne


#4 

10-06-2009 20:47:31

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

NodeList.clear(); direct comme ça, ça ne fonctionne pas...Pourtant ça devrait :s


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#5 

10-06-2009 20:59:49

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Hmm, étrange,

Dans la fonction 'Clear' de arrayType, essais en commentant la ligne allocator.deallocate(data); // delete [] data;
si c'est possible.


Force et sagesse...

Hors ligne


#6 

10-06-2009 21:57:56

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

Hum j'ai testé et le problème est identique je comprends pas trop, enfin bon vais virer le clear() et basta


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#7 

10-06-2009 22:25:37

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

Alors j'ai pas rêvé, dans certaines conditions le erase ne fait pas son boulot et dans d'autre, le clear pose problème, ça sent la mauvaise gestion de pointeur dans le code d'irrlicht...je sais pas ce qu'ils ont pû trifouiller, j'espère que ça sera résolvé dans la prochaine release


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#8 

10-06-2009 22:34:55

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Hmmm, en effet à suivre, car c'est relativement pas mal utilisé dans le moteur. Si cela sent le bug, c'est pas top...


Force et sagesse...

Hors ligne


#9 

12-06-2009 19:32:31

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

perso avec un core::array je delete l'élément avants de faire un remove ou un clear wink
et sa marche impeccable ...
en gros je supprime toute les entités puis je vide l'array

Hors ligne


#10 

13-06-2009 01:04:24

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

oué magun sauf que tu delete quand il s'agit de pointer et là c'est pas mon cas, c'est un tableau de struct....


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#11 

13-06-2009 01:29:51

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

tu peut mettre un destructeur dans une struct normalement ... enfin ses toi qui voie

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
883 membres
1429 sujets
11121 messages
Dernier membre inscrit: Saidov17
68 invités en ligne
Aucun membre connecté
RSS Feed