cs_simH
Messages postés13Date d'inscriptionlundi 13 juillet 2009StatutMembreDernière intervention18 juin 2010
-
12 août 2009 à 20:45
Mayzz
Messages postés2813Date d'inscriptionmardi 15 avril 2003StatutMembreDernière intervention 2 juin 2020
-
12 août 2009 à 22:13
Bonjour à tous,
Je suis sous VB2008 Express Edition et j'ai un pseudo-problème de Warnings.
J'ai un code avec deux boucles :
-l'une remplissant le tableau dTab
-l'autre allant chercher ses valeurs.
'Première boucle :
For i = 0 To 2
ReDim Preserve dTab(i)
dTab(i) = i
Next
'Deuxième boucle :
For i = 0 To UBound(dTab)
MsgBox(dTab(i))
Next
Je parle de pseudo-problème parce que évidemment le code marche très bien comme ça. Cependant VB me souligne dTab dans UBound(dTab)et me renvoie le warning :
"Variable 'dTab' is used before it has been assigned a value. A null reference exception could result at runtime".
J'en déduis qu'il doit y avoir une façon plus correct de l'écrire. En mettant MsgBox(dTab(i)) directement dans la première le problème est résolu mais cela voudrais dire qu'on ne peut pas tranquillement faire deux boucles qui marchent bien sans être embêté par des warnings ?
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 12 août 2009 à 22:02
Le Redim est à faire avant de stocker les données (ce qui semble logique)
Si tu n'as pas le choix tu peux faire le ReDim dans la boucle comme tu avais fait. Mais tu vas faire un ReDim à chaque itération, ce qui va te bouffer des ressources, surtout si le tableau est assez important.
Si tu avais la possibilité, ça serait mieux de faire un seul et unique ReDim. Mais ça dépend de ton programme.
[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Mayzz
Messages postés2813Date d'inscriptionmardi 15 avril 2003StatutMembreDernière intervention 2 juin 202028 12 août 2009 à 22:13
Pour ce qui est du message d'erreur, il indique qu'une nullexception peut se produire dans le cas ou une une variable déclaré n'a pas été assigné.
Exemple plus concrêt :
Dim Variable As String
If Condition Then
Variable ="Valeur"
End If
Ici, si la condition n'est pas remplie la variable peut être de valeur nulle, pour une chaine ce n'est pas dramatique mais dans le cas ou la variable serait une classe, cela pourrait provoquer un bug.
Si le message te gène, tu peux toujours déclarer comme suit :
Dim Variable As String = ""
Dim MaClasse As Collection = Nothing
L'opérateur = bleufera vb en lui faisant croire que la variable a été assigné. Tu peu aussi simplement désactiver ces avertissement dans les paramètres de projet.
++ Mayzz.
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
cs_simH
Messages postés13Date d'inscriptionlundi 13 juillet 2009StatutMembreDernière intervention18 juin 2010 12 août 2009 à 21:28
Merci pour ta réponse. J'essayerai de l'applique dès que possible.
Par contre j'ai donné un exemple simplifié pour illustrer le problème et on ne sait pas forcement à l'avance combien de cases va avoir le tableau et on peut être amené à être obligé de redimensionner le tableau dans une boucle...
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 12 août 2009 à 21:36
Si ta première boucle sert à remplir le tableau, avant de commencer la boucle tu dois savoir à priori combien de case il va contenir puisque c'est la borne supérieure de la boucle, tu peux donc à priori le redimensionner juste avant la boucle comme j'ai indiqué.
Si évidemment, la borne supérieure de la boucle ne correspond pas à la taille du tableau ça devient plus compliqué.
[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
cs_simH
Messages postés13Date d'inscriptionlundi 13 juillet 2009StatutMembreDernière intervention18 juin 2010 12 août 2009 à 21:42
Dans mon cas je devrais pouvoir gérer avec la borne supérieure, mais du coup je me posais la question dans le cas où il y aurait une condition genre If qui fait que le tableau ne s'agrandit pas systématiquement à chaque itération...
Est-ce qu'il faudrait alors compter le nombre d'éléments et puis faire ensuite un Redim Preserve en fonction du compte ? Je trouve ça assez compliqué pour pas grand chose et ne comprends pas la logique de VB2008 pour le coup...