Se serait trop recursif !!!!!!!!!!!! y'a bien un moyen
banana_destruct
Messages postés12Date d'inscriptionjeudi 22 juillet 2004StatutMembreDernière intervention27 septembre 2004
-
30 août 2004 à 13:27
cs_PhilippeE
Messages postés437Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention10 août 2010
-
30 août 2004 à 17:17
vola en fait j'ai fait une fonction pour un demineur voila la partie qui pose probleme sa me marque esapce de pile insuffisante
Function ccc(carré)
For k = 1 To Longueur
For l = 1 To LargeurIf carré bizar(k, l) And Demineur(k, l) 0 Then
If (k - 1) > -1 And (l - 1) > -1 Then
Command1(bizar(k - 1, l - 1)).Caption = Command1(bizar(k - 1, l - 1)).Tag
If Command1(bizar(k - 1, l - 1)).Tag = 0 Then
Call ccc(bizar(k - 1, l - 1))
End If
End If
If (k - 1) > -1 Then
Command1(bizar(k - 1, l)).Caption = Command1(bizar(k - 1, l)).Tag
If Command1(bizar(k - 1, l)).Tag = 0 Then
Call ccc(bizar(k - 1, l))
End If
End If
If (k - 1) > -1 And (l + 1) < Largeur Then
Command1(bizar(k - 1, l + 1)).Caption = Command1(bizar(k - 1, l + 1)).Tag
If Command1(bizar(k - 1, l + 1)).Tag = 0 Then
Call ccc(bizar(k - 1, l + 1))
End If
End If
If (l - 1) > -1 Then
Command1(bizar(k, l - 1)).Caption = Command1(bizar(k, l - 1)).Tag
If Command1(bizar(k, l - 1)).Tag = 0 Then
Call ccc(bizar(k, l - 1))
End If
End If
If (l + 1) < Largeur Then
Command1(bizar(k, l + 1)).Caption = Command1(bizar(k, l + 1)).Tag
If Command1(bizar(k, l + 1)).Tag = 0 Then
Call ccc(bizar(k, l + 1))
End If
End If
If (k + 1) < Longueur And (l - 1) > -1 Then
Command1(bizar(k + 1, l - 1)).Caption = Command1(bizar(k + 1, l - 1)).Tag
If Command1(bizar(k + 1, l - 1)).Tag = 0 Then
Call ccc(bizar(k + 1, l - 1))
End If
End If
If (k + 1) < Longueur Then
Command1(bizar(k + 1, l)).Caption = Command1(bizar(k + 1, l)).Tag
If Command1(bizar(k + 1, l)).Tag = 0 Then
Call ccc(bizar(k + 1, l))
End If
End If
If (k + 1) < Longueur And (l + 1) < Largeur Then
Command1(bizar(k + 1, l + 1)).Caption = Command1(bizar(k + 1, l + 1)).Tag
If Command1(bizar(k + 1, l + 1)).Tag = 0 Then
Call ccc(bizar(k + 1, l + 1))
End If
End If
End If
Next
Next
End Function
Le code en lui meme n'est pas tres important et le probleme vient du fait que apperement ce serait on va dire "trop recursif"
et sa me marque espace de pile insuffisante, et donc comment remedier a cela y aurait t'il moyen d'augmanter la pile ou comment faire autrement ?
A voir également:
Se serait trop recursif !!!!!!!!!!!! y'a bien un moyen
econs
Messages postés4030Date d'inscriptionmardi 13 mai 2003StatutMembreDernière intervention23 décembre 200825 30 août 2004 à 14:03
Première chose :
Si la pile explose, c'est très certainement parce que ton bouclage est infini. Je vais regarder plus attentivement la chose.
Deuxième chose : Evite de mettre des accents dans tes noms de variables
Troisième chose : Pourquoi ccc est-elle une fonction ? Elle ne renvoie rien. Ce serait plus adéquat de la renommer en :
Private Sub ccc(carre As ... )
[...]
End Sub
econs
Messages postés4030Date d'inscriptionmardi 13 mai 2003StatutMembreDernière intervention23 décembre 200825 30 août 2004 à 14:13
Difficile de s'en sortir quand il y a autant de variables dont on ne connait pas l'utilité.
Néanmoins, j'ai noté ceci :
If (k - 1) > -1 And ... Then
La condition en rouge est TOUJOURS VRAIE dans ta boucle car k>0. Par conséquent, il y a quelques appels récursifs qui seront systématiquement faits (et certainement pas à bon escient).
Du coup :
Function ccc(carré)
For k = 1 To Longueur
For l = 1 To Largeur If carré bizar(k, l) And Demineur(k, l) 0 Then
If (k - 1) > -1 And (l - 1) > -1 Then
Command1(bizar(k - 1, l - 1)).Caption = Command1(bizar(k - 1, l - 1)).Tag
If Command1(bizar(k - 1, l - 1)).Tag = 0 Then
Call ccc(bizar(k - 1, l - 1))
End If
End If
la ligne bleue est toujours vraie.
la ligne en rouge sera toujours exécutée si par malheur Command1(bizar(k - 1, l - 1)).Tag = 0 au démarrage.
Bref, le programme tourne en boucle, jusqu'à ce que mort s'en suive ...
Il est très dangereux de mettre des boucles For qui englobent une fonction récursive. Normalement, la récursivité doit permettre de se soustraire des boucles For.
banana_destruct
Messages postés12Date d'inscriptionjeudi 22 juillet 2004StatutMembreDernière intervention27 septembre 2004 30 août 2004 à 14:20
je suis presque sur que ma fonction n'est pas infini, la elle comporte 8 structure if qui peuvent rapeler la fonction et sa fonctionne pas, mais j'ai essayer avec 4 sa fonctionne,c'est a partir de 5 que sa me met le message d'erreur.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Scalpweb
Messages postés1467Date d'inscriptionsamedi 13 mars 2004StatutMembreDernière intervention 5 mai 20104 30 août 2004 à 14:23
C'est facile de savoir si elle est infini : tu place un truc comme :
i = i + 1
debug.print i
(i est ici une variable globale integer)
et tu vois tout desuite qu'elle valeur à i au moment ou ça bug.
----------------------------------------------------------------------------------
Les logiciels plantent car ils se basent sur la théorie qu'avec 9 femmes enceinte vous pouvez avoir un bébé en un mois. (Wernher von Braun)
banana_destruct
Messages postés12Date d'inscriptionjeudi 22 juillet 2004StatutMembreDernière intervention27 septembre 2004 30 août 2004 à 17:09
ba ma condition d'arret c'est quand aucune des conditions if n'est remplit et en fait j'ai trouver un autre moyen pour mon demineur pour remplacer cett fonction qui est peut etre un peu trop recursive a mon gout lol. merci quand meme pour les reponses
cs_PhilippeE
Messages postés437Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention10 août 20102 30 août 2004 à 17:17
Ce que je n'ai pas compris, c'est pourquoi tu reparcours à chaque fois la totalité de ta zone de jeu ???
Normalement à chaque tour de récursivité tu n'explores que les 8 cases alentours, et chacune relance la fonction.
A noter que dans cette méthode, tu peux optimiser en marquant les cases déjà traitées, ce qui permet de ne pas les traiter n fois.