Erreur StackOverflowException alors qu'il n'y a pas de boucle infini... juste tr
ludovicbarman
Messages postés11Date d'inscriptionjeudi 21 août 2008StatutMembreDernière intervention23 août 2009
-
28 août 2008 à 19:51
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 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 )
SharpMao
Messages postés1024Date d'inscriptionmardi 4 février 2003StatutMembreDernière intervention 7 juin 201069 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)
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 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?
Vous n’avez pas trouvé la réponse que vous recherchez ?
ludovicbarman
Messages postés11Date d'inscriptionjeudi 21 août 2008StatutMembreDernière intervention23 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
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 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....
ludovicbarman
Messages postés11Date d'inscriptionjeudi 21 août 2008StatutMembreDernière intervention23 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 :
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 ;)
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 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).
ludovicbarman
Messages postés11Date d'inscriptionjeudi 21 août 2008StatutMembreDernière intervention23 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*
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 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...