Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 2009
-
26 août 2006 à 11:13
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDerniè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 ?
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
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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...
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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()
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.
Dolphin Boy
Messages postés630Date d'inscriptionvendredi 5 mai 2006StatutMembreDernière intervention17 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) ?
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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...