PDA

Voir la version complète : probleme avec un algo simple


Thelvyn
21/11/2005, 11h40
javais besoin d'une liste chainée tres simple donc pas la peine de passer par les vecteurs ou les list de Std. Tous les elements sont crées avec new donc il faut les delete

je voudrais transformer ce code , je veux un algo avec une boucle parce que ce code n'est valable que pour un nombre limite d'elements
( inline parce que c'est la seule fonction de la class )

inline void Free(){
if(next != 0)
next->Free();
delete next;
next = 0;
return;
}

jai fais differents test mais ca ne marche pas :00000017:
ex. algo tres simple :

- tant que (next != 0)
- temp = next
- je parcours la liste jusqu'au dernier element (tel que temp->next == 0)
- je supprime le dernier element
- je recommence

inline void Free(){
Type *temp;
while(next != 0)
{
temp = next;
while(temp->next != 0)
temp = temp->next;
delete temp;
temp = 0;
}
}

et jai une exception : "0xC0000005: Access Violation" sur le
while(temp->next != 0)

je ne vois pas ma connerie :00000010: aidez moi svp

ZeBlueCow
21/11/2005, 12h20
Type * current = this->next, * tmp = NULL;

while(current)
{
tmp = current->next;
delete current;
current = tmp;
}

...ça devrait fonctionner... mais ça ne supprime pas 'this' (l'objet appelant).

Thelvyn
21/11/2005, 12h26
merci ca marche :)

vous pouvez m'expliquer pourquoi le mien ne marche pas ? :00000003:

Laeti²x
21/11/2005, 12h27
struct Item
{
Item * m_pNext;
// et a cote t'as des donnees a liberer par le Free
};


la methode que tu as montre au debut marche a priori, elle est recusive, c'est pour ca que tu ne la vois pas se derouler.

La preuve : ca, ca marche tres bien :


inline ~Item()
{
if (m_pNext)
{
delete(m_pNext);
}
}


apres execution, il n'y a pas de memory leaks.

la dedans :


inline void Free() {
Type *temp;
while(next != 0)
{
temp = next;
while(temp->next != 0)
temp = temp->next;
delete temp;
temp = 0;
}
}


*) le premier while est inutile, puisque la valeur de next ne change pas dans la boucle
*) le premier while est source de plantage puisque temp = next est suivi de delete temp (next est la sauvegarde du pointeur temp qui est efface...)

*) pareil, pour le 2eme while (dumoins en ce qui concerne le plantage)

Thelvyn
21/11/2005, 12h42
dacodac :00000014:

Loulou
21/11/2005, 13h36
C'est pas pour troller, mais ...
javais besoin d'une liste chainée tres simple donc pas la peine de passer par les vecteurs ou les list de Std
Faudra m'expliquer en quoi il est plus simple de recoder (sûrement moins bien) un truc standard prêt à l'emploi, qui garantit des perfs optimales et un fonctionnement robuste.

Mokona
21/11/2005, 13h39
Pour un exercice (personnel ou scolaire) ?

Penser et implémenter sa liste chaînée, c'est à faire au moins une fois. Ne serait-ce que pour reconnaître le motif dans les projets sur lesquels on est amené à travailler et qui n'utilisent pas forcément les STLs.

grob1212
21/11/2005, 16h45
[...] qui garantit des perfs optimales [...]

C'est bien certain ça ?

Loulou
21/11/2005, 17h13
Pour un exercice (personnel ou scolaire) ?

Penser et implémenter sa liste chaînée, c'est à faire au moins une fois. Ne serait-ce que pour reconnaître le motif dans les projets sur lesquels on est amené à travailler et qui n'utilisent pas forcément les STLs.
Je suis entièrement d'accord avec ça, ce qui me fait tiquer c'est sa justification du non-emploi de la STL ("c'est plus simple sans").

C'est bien certain ça ?
Algorithmiquement parlant oui, techniquement parlant non, même s'il est difficile de faire mieux.

Thelvyn
21/11/2005, 21h46
la raison est simple :
jai fais un test en metant tous mes triangles dans un vector
resultat ca rame :00000010:
dans une liste std ca rame :00000010:
avec le petit pointeur sur le triangle suivant ca rame moins !!! :00000023:

et je n'ai besoin d'aucun algorithme de tri pour ces triangles donc ma methode me convient parfaitement ! c'est vrai Algorithmiquement c'est beaucoup moins bien que la stl mais niveaux performances il n'y a pas photo sur mon jeu du moins ( jai testé avec vraimant beaucoup de triangles )

mais bon j'avoue que je ne suis pas un pro de la stl ... donc peutetre que j'utilisait mal les containeurs ...

en tout cas merci pour ceux qui m'ont aidé ^^

PS. j'utilise un peu la stl comem ;) mais avec moderation ...

Loulou
21/11/2005, 22h04
C'est vrai qu'on a vite fait de mal utiliser les conteneurs standards, surtout lorsqu'on ne connaît pas les coûts algorithmiques qui se cachent derrière chaque opération.

Par contre personnellement j'utilise au maximum la STL et ses conteneurs dans mes jeux vidéo, ça n'a jamais été une source de ralentissement (il y en a tellement d'autres avant...).

Thelvyn
21/11/2005, 22h06
moi j'utilise la stl surtout dans les class manager : TextureManager , SoundManager ect. les map y sont tres pratiques avec les algos de recherche par clefs :)

TanEk
22/11/2005, 19h02
Tu peux me filer des bouts de code qui utilisent la STL ? Je vois pas comment on peut utiliser mal la STL... A moins de faire des copies d'objets ? Ta liste de triangles, c'est bien une liste de pointeurs de triangle ?

Thelvyn
22/11/2005, 19h24
non ce ne sont pas des pointeurs sur des triangles , ce sont des triangles avec un pointeur sur un autre triangle ...

CodyX
22/11/2005, 23h25
Juste par curiosité sa rame comment exactement ?
Et beaucoup de triangles pour toi sa veut dire combien ?

TanEk
23/11/2005, 10h24
non ce ne sont pas des pointeurs sur des triangles , ce sont des triangles avec un pointeur sur un autre triangle ...

Je parlais de ta liste STL, tu fais bien :

std::list<Triangle*>

Et non pas :

std::list<Triangle>

Car si tu fais le deuxième cas, alors là... Il commence à te faire des copies d'objets de partout et ça devient vraiment lent :D.

Loulou
23/11/2005, 11h46
std::list ne fait pas forcément des "copies d'objets de partout" ; beaucoup moins que std::vector en tout cas, et aucune inutile si on gère bien la taille et les allocations.

TanEk
23/11/2005, 22h51
Bah tu m'étonnes que c'est lent... Si tu fais std::list<Objet> bein ça fera pleins de copies et ça sera lent. Alors que si tu lui envoies des pointeurs ça sera cent fois plus rapide (et peut-être plus rapide ou en tout cas aussi rapide que ta liste perso...). Essaye tu verras bien ;).