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

Signaler
Messages postés
11
Date d'inscription
jeudi 21 août 2008
Statut
Membre
Dernière intervention
23 août 2009
-
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
-
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

Messages postés
11
Date d'inscription
jeudi 21 août 2008
Statut
Membre
Dernière intervention
23 août 2009

Ha en fait j'ai aussi (quel bonheur) des 'System.OutOfMemoryException' (exactement dans le même contexte)

Ludovic BARMAN
Codeur C#
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
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
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
62
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)
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
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?
Messages postés
11
Date d'inscription
jeudi 21 août 2008
Statut
Membre
Dernière intervention
23 août 2009

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#
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
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....
Messages postés
11
Date d'inscription
jeudi 21 août 2008
Statut
Membre
Dernière intervention
23 août 2009

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#
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
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
Messages postés
11
Date d'inscription
jeudi 21 août 2008
Statut
Membre
Dernière intervention
23 août 2009

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#
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
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...