Boucle bizarre

Signaler
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
-
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
-
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

Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
35
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
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
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.
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
35
Ben, donne plus de code alors



Kenji
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
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.
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
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.
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
35
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
Messages postés
630
Date d'inscription
vendredi 5 mai 2006
Statut
Membre
Dernière intervention
17 février 2007

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) ?
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
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.