Warnings VB.NET

Résolu
cs_simH Messages postés 13 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 18 juin 2010 - 12 août 2009 à 20:45
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Derniè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 ?

7 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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
3
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
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.
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
12 août 2009 à 21:14
Ton ReDim Preserve ne sert absolument à rien dans la boucle, il vaut mieux le sortir pour le faire avant la boucle.

       ReDim Preserve dTab(2)
       For i = 0 To 2
            dTab(i) = i
        Next



[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
cs_simH Messages postés 13 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 18 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...
0

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

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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
0
cs_simH Messages postés 13 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 18 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...
0
cs_simH Messages postés 13 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 18 juin 2010
12 août 2009 à 22:09
Bon je dis OK.
Merci, j'ai l'impression d'avoir un truc plus propre maintenant.

Mais je me pose toujours la question de savoir comment ça se passe si on a quelque chose du genre :
For i = 0 to n 
    If [Condition] Then
         nIndex = nIndex + 1 
         Redim Preserve dTab(nIndex)
    End If
Next


auquel cas il y aurait encore des Warnings...
0
Rejoignez-nous