Erreur StackOverflowException alors qu'il n'y a pas de boucle infini... juste tr

ludovicbarman Messages postés 11 Date d'inscription jeudi 21 août 2008 Statut Membre Dernière intervention 23 août 2009 - 28 août 2008 à 19:51
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 - 1 sept. 2008 à 15:21
Bonjour !

J'ai un petit problème avec une application : c'est une application de pathfinding (recherche de chemin le plus court dans un labyrinthe), et forcément si la taille du labyrinthe devient "relativement" conséquente (quoi que ça arrive aléatoirement, enfin, lisez la suite ), le traitement prend du temps (mais jamais plus de 2-3 sec).

Mon problème est que de temps en temps, pour une taille de labyrinthe qui marchait très bien avant, j'ai une erreur System.StackOverflowException. J'en déduis donc que je consomme trop de mémoire... mais je ne suis pas dans une boucle infini, juste dans un algorithme complexe !

N'y a-t-il pas un moyen de laisser "vider" la mémoire entre 2 calculs (genre Application.DoEvents() pour la mémoire) pour, à défaut d'accélérer le processus (), éviter les erreurs ?

Le truc vraiment bizarre c'est que des fois ça plante sur une map 5x5, je relance l'application et je calcul des 100x100 sans problèmes... c'est vraiment très aléatoire comme bug, mais je DOIS pouvoir l'enlever (c'est mon projet de travail de maturité, pas envie que ça plante en live )

Merci !

Ludovic BARMAN
Codeur C#

10 réponses

ludovicbarman Messages postés 11 Date d'inscription jeudi 21 août 2008 Statut Membre Dernière intervention 23 août 2009
28 août 2008 à 20:17
Ha en fait j'ai aussi (quel bonheur) des 'System.OutOfMemoryException' (exactement dans le même contexte)

Ludovic BARMAN
Codeur C#
0
cs_Bidou Messages postés 5486 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
28 août 2008 à 22:12
Une méthode récursive qui pose problème peut-être?
Dur à dire sans code...

Sinon tu peux jeter un oeil ici:
http://www.csharpfr.com/codes/ALGORITHME-PATHFINDING-STAR_41235.aspx
0
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
29 août 2008 à 06:52
Hello,

Deux ou trois petites questions :
- Est-ce que les labyrinthes sont générés aléatoirement ?
- Si non, est-ce que le même labyrinthe produit toujours l'erreur.
- S'ils sont générés aléatoirement, essaie de les enregistrer avant de lancer la pathfinding, pour pouvoir réessayer avec le même labyrinthe.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
29 août 2008 à 10:27
sans code cest difficile....apres, n'aurais tu pas certains cas dans ton code ou tu rentre dans une récursivité/boucle infinie a cause d'un cas mal codé, tout simplement?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ludovicbarman Messages postés 11 Date d'inscription jeudi 21 août 2008 Statut Membre Dernière intervention 23 août 2009
29 août 2008 à 12:36
Je peux bien vous passer un bout de code, mais le problème c'est que ça lève l'exception un peut n'importe où (je vous passerai la région) mais c'est un gros, gros projet... sinon je suis absolument CERTAIN de ne pas être dans une boucle infinie ou autres. C'est juste que (je suppose), comme le "time exceeded" en php après 30 secondes, le système considère que ça a bossé trop longtemps... je vous mettrai un bout de code ce soir si vous voulez

Ludovic BARMAN
Codeur C#
0
cs_Bidou Messages postés 5486 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
29 août 2008 à 13:19
un iiiiiiiiiiiiiiiiiiiimense projet !! (on en a probablement jamais vu de si grand).
Si tu veux de l'aide, il faut être plus précis et donner du code, sinon je vois pas comment on pourrait t'aider....
0
ludovicbarman Messages postés 11 Date d'inscription jeudi 21 août 2008 Statut Membre Dernière intervention 23 août 2009
29 août 2008 à 17:30
Mais non c'est pas ce que je voulais dire... c'est juste que le projet dans son ensemble est très gros (beaucoup d'algo implémentés etc etc), et je pense que le problème ne survient pas de la classe elle-même. Enfin c'est vous les pros, la voici :

http://ludovicbarman.hostarea.org/tm/Dijkstra.cs

En fait l'exception est à chaque fois levée dans la fonction findWalkableChildren()
(tout en bas).

Merci d'avance ! Et désolé j'aurai du le mettre dès le début, je voulais juste savoir si il existait une solution simple (j'avais l'espoir de ne pas être le seul à avoir ce problème )

PS: Si vous avez des commentaires sur la façon de coder... n'hésitez pas merci
PS2: Pour répondre à SharpMao, c'est une excellente idée que je n'avais pas du tout testé ;) je vais essayer ;)

Ludovic BARMAN
Codeur C#
0
cs_Bidou Messages postés 5486 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
29 août 2008 à 21:57
Je pars en week-end maintenant donc jpeux pas regarder avec dimanche soir, mais si c'est l'algo de DIJKSTRA ben ça doit pas être un problème, c'est super connu comme méthode, c'est un algo simple à mettre en place donc tu devrais trouver des tonnes d'exemple sur le net... (pour comparer avec ce que tu as fait).

Regarde du côté de l'algo Astar aussi, si je me rappelle bien c'est plus rapide que DIJKSTRA et en plus je l'ai totalement implémenté dans le lien que je t'ai donné plus haut:
http://www.csharpfr.com/codes/ALGORITHME-PATHFINDING-STAR_41235.aspx
0
ludovicbarman Messages postés 11 Date d'inscription jeudi 21 août 2008 Statut Membre Dernière intervention 23 août 2009
29 août 2008 à 23:07
Merci beaucoup, mais en fait c'est pas ce que vous croyez ;)

Ceci est un projet de travail de maturité sur le Pathfinding et la robotique ; un de nos buts est de comparer l'efficacité des algorithmes dans différentes situations. Evidemment je peux pas pomper sur internet, bien que je m'en soit inspiré. Donc je peux pas reprendre une source existante et je ne peux pas "supprimer" le problème en utilisant A*

Ludovic BARMAN
Codeur C#
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
1 sept. 2008 à 15:21
je suis pas rentré dans le détail complet du code mais tu semble bien rentré dans une pseudo récursivité trop énorme :

ton exception se produit uniquement dans findwalkablechildren car tu n'alloue rien dans FindPath (sinon ca pèterais sois dans l'une sois dans l'autre).
A mon avis, le problème est que pour chaque point tu recommence aussi la recherche pour le point d'ou tu viens, donc a chaque itération, tu recalcule l'itération précedente. donc chaque itération augmente le nombre de recherche de manière exponentielle. je m'explique :

imagineons que tu cherche a les cases
1 - 2 - 3 - 4
tu vas chercher a aller de 1 à 4. première itération tu vas voir que de 1 tu peux aller a 2. deuxième itération tu peux aller de 2 à 1, et de 2 à 3. à partir de la tu peux aller de 1 à 2 (puisque de 2 à 1), et de 3 à 2. Le problème vient du fait que recommence a chercher depuis 1 (oulah ca devient compliqué).

Bref, commence par t'assurer que tu ne reviens pas en arrière car cela t'augmente tes recherches de manière exponentielle :
tu recommence ton pathfinding depuis 0 une fois par itération. 1ère itération, tu cherche ton chemin 1 fois depuis le début. 2 ème 2 fois depuis le début puis 1 fois depuis la deuxieme case, etc.
Au bout de 300 itération, tu fais 300 fois depuis le début, 299 depuis la deuxieme, etc...
0
Rejoignez-nous