Se serait trop recursif !!!!!!!!!!!! y'a bien un moyen

banana_destruct Messages postés 12 Date d'inscription jeudi 22 juillet 2004 Statut Membre Dernière intervention 27 septembre 2004 - 30 août 2004 à 13:27
cs_PhilippeE Messages postés 437 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 10 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 ?

9 réponses

econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 25
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

Manu
0
Scalpweb Messages postés 1467 Date d'inscription samedi 13 mars 2004 Statut Membre Dernière intervention 5 mai 2010 4
30 août 2004 à 14:09
Oulà ! Imaginons :
avec longueur = 10
et largeur = 10
la fonction ccc est apellé 10^10 si je ne trompe pas ! C'est pas étonnant que ça plante !

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)
0
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 25
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.

Manu
0
banana_destruct Messages postés 12 Date d'inscription jeudi 22 juillet 2004 Statut Membre Dernière intervention 27 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.
0

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

Posez votre question
Scalpweb Messages postés 1467 Date d'inscription samedi 13 mars 2004 Statut Membre Dernière intervention 5 mai 2010 4
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)
0
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 25
30 août 2004 à 14:56
Dis aussi ce que tu veux faire, parce que là, ta fonction est bien jolie, mais on ne peut ni la tester, ni te fournir un code de rechange...

Manu
0
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 25
30 août 2004 à 15:03
Autre chose :

Toute boucle récursive doit avoir une condition d'arrêt. Où se trouve la tienne ?

Manu
0
banana_destruct Messages postés 12 Date d'inscription jeudi 22 juillet 2004 Statut Membre Dernière intervention 27 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
0
cs_PhilippeE Messages postés 437 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 10 août 2010 2
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.
0
Rejoignez-nous