Boucle bizarre

Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 - 26 août 2006 à 11:13
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 - 26 août 2006 à 15:44
Bonjour,
C'est le matin et je suis encore un peu endormi, néanmoins il me semble que cette erreur est bizarre... Voila le code :

Dim r As Double
While SC.Count > 0
Depassement = False
a = 0
r = Calculer(SC(SC.Count - 1))
If Depassement = False Then
SC.RemoveAt(SC.Count - 1)
End If
End While
Return r

Comment est-il possible qu'a un moment il me bloque sur la 5e ligne avec une IndexOutOfRange Exception en me disant que SC (qui est une collection) est vide alors que j'ai ma vérification pour continuer la boucle juste avant ??? Depassement et a ne sont que des variables... Vu la nature de l'erreur c'est sans doute un bête truc, mais je vois vraiment pas quoi... Y'a qqun qui est plus réveillé et dispo que moi qui peut m'expliquer svp ?

Julien.

8 réponses

Utilisateur anonyme
26 août 2006 à 11:17
Salut,



Ben c'est normal, à chaque passe, il est enleve un.
Si la longeur de ton tableau était 5, comme il est enleve à chaque passe, au bout de 5 passe erreur.
Vérifie que ta condiotion If Depassement = False Then est bien la bonne.
C'est pas plutot If Depassement = True Then ?



Kenji



Il était une fois, un pauvre petit règlement que personne ne lisait. Il est tout sympa mais il est triste, aidez-le, lisez-le, ca lui ferait tellement plaisir ainsi qu'a nous. Merci.
Ca sent le sondage sur ce lien
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
26 août 2006 à 11:20
Ben non puisqu'avant qu'il entre dans la boucle, il vérifie que le tableau est pas vide.
Oui je suis sûr pour dépassement = False, la fonction calculer peut le mettre sur True...

Julien.
0
Utilisateur anonyme
26 août 2006 à 11:28
Ben, donne plus de code alors



Kenji
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
26 août 2006 à 11:29
J'explique en deux mots le fonctionnement :
J'ajoute à SC (comme Stack Calcul en fait) un objet que j'aimerais calculer
J'entre dans la boucle que je vous ai mise,
Il tente de calculer le dernier élément de SC
Si il y arrive, dépassement toujours false, il me renvoie r et on sort, pas de problème...
Si il n'y arrive pas (car calculer est récursive et donc stackoverflow possible), Calculer empile un sous-objet du premier que j'avais à calculer et mets dépassement sur true pour que rien ne soit désempilé (en effet il faudra tout recalculer plus tard, lorsqu'on aura la réponse du calcul des sous-objets)
La boucle continue jusqu'à ce que tout soit calculé et que j'ai ma réponse pour mon premier objet empilé...
J'espère que c'est clair ^^ :p
Merci pour votre aide !

Julien.
0

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

Posez votre question
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
26 août 2006 à 11:34
Voila du code :
a est mon "Compteur d'imbriquement" pour éviter le stackoverflow


Function GestionCalcul() As Double
Dim r As Double
While SC.Count > 0
Depassement = False
a = 0
r = Calculer(SC(SC.Count - 1))
If Depassement = False Then
SC.RemoveAt(SC.Count - 1)
End If
End While
Return r
End Function

Private Function Calculer(ByRef c As Capsule) As Double
System.Windows.Forms.Application.DoEvents()
Dim r As Double, p As Plage
If c Is Nothing Then Return 0
If c.Modif = False Then Return c.LastVal 'Si c a déja été calculer on renvoie tt de suite sa dernière valeur connue
a += 1
If a >MaxRecu Then 'MaxRecu étant une constante StackOverflow - 10
Depassement = True
SC.Add(c)
c.Modif = True
a -= 1
Return 0
End If
c.Modif = False
Select Case c.Operation
... Calcul avec appel récursif de la fonction calculer
(ca fait 300 lignes...) et le résultat est stocké dans r

c.LastVal = r
a -= 1
Return r
end function

Une demande de calcul se fait donc comme ceci :
SC.Add(CapsuleACalculer)
Resultat = GestionCalcul()

Julien.
0
Utilisateur anonyme
26 août 2006 à 12:01
Ben la ... heu
Il faut que tu fasse du débbuggage pas à pas. Mettre des points d'arret et vérifier les contenu des variables.
La je peux pas faire grands chose.



Kenji
0
Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 février 2007
26 août 2006 à 15:40
Salut,
Si tu utilises une Stack (Dim SC as New Stack), sers toi plutôt de Push pour ajouter un objet et Pop pour l'enlever.
Si c'est une collection, comme en vb6, tu dois mal gérer Depassement.
L'erreur apparait sur quelle ligne ? SC.RemoveAt(SC.Count - 1) ?
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
26 août 2006 à 15:44
J'utilisais un Stack(Of Capsule) avant mais j'avais eu des légers problèmes je ne sais plus exactememnt pourquoi, alors je suis passé à la list(Of Capsule)...
Sinon je viens d'essayer avec un simple tableau et un pointeur vers le dernier élément, et je n'ai plus ce problème, à mon avis il y avait un problème au niveau de la capacité de la Liste, en effet maintenant que je regarde, elle est limitée à 1024 et je vais bien plus loin que ca...

Merci pour vos réponses

Julien.
0
Rejoignez-nous