Bonjour
Je programmais joyeusement dans la douceur de ces fêtes de fin d'année quand je me suis rendu compte que mon programme, qui marchait pour un tableau de 20x14 (celui utilisé par défaut), plantait pour un tableau de 30x25. "Dépassement de pile" qu'il disait.
Mais je m'étonne.
D'abord, le problème n'est pas un problème de réservation mémoire. C'est bien un problème de récursivité trop poussée. Trop d'appels de fonctions imbriquées. Seulement, pour une grille XxY, il y a 8XY+6(X+Y)+5 éléments qui s'interpellent.
Pour une grille 20x14, 2049 éléments.
Pour une grille 30x25, 6335 éléments.
D'où ma question: Quelle est la taille de la pile ? Est-il normal qu'elle sature avec, environ, 7000 appels de méthodes imbriqués?
ps: Chaque objet alerte ses voisins qui, s'ils ne sont pas au courant, alertent leur propres voisins. Comme la récursivité s'arrête quand tout le monde est au courant, il n'y a pas plus de 7000 appels de fonctions. Cependant, y a t il une autre méthode ?
pps:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError at sun.nio.cs.SingleByteEncoder.encodeArrayLoop(Unknown Source) at sun.nio.cs.SingleByteEncoder.encodeLoop(Unknown Source) at java.nio.charset.CharsetEncoder.encode(Unknown Source) at sun.nio.cs.StreamEncoder.implWrite(Unknown Source) at sun.nio.cs.StreamEncoder.write(Unknown Source) at java.io.OutputStreamWriter.write(Unknown Source) at java.io.BufferedWriter.flushBuffer(Unknown Source) at java.io.PrintStream.write(Unknown Source) at java.io.PrintStream.print(Unknown Source) at java.io.PrintStream.println(Unknown Source) at MonObjet.alerteGenerale(Grille.java:27) at AutreObjet.alerteVoisins(Grille.java:76) at MonObjet.alerteGenerale(Grille.java:33) at EncoreUnAutreObjet.alerteVoisins(Grille.java:272) at MonObjet.alerteGenerale(Grille.java:33) at AutreObjet.alerteVoisins(Grille.java:77) at MonObjet.alerteGenerale(Grille.java:33)
Partager