Warnings VB.NET [Résolu]

Signaler
Messages postés
13
Date d'inscription
lundi 13 juillet 2009
Statut
Membre
Dernière intervention
18 juin 2010
-
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
-
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

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
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
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
31
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.
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
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
Messages postés
13
Date d'inscription
lundi 13 juillet 2009
Statut
Membre
Dernière intervention
18 juin 2010

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...
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
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
Messages postés
13
Date d'inscription
lundi 13 juillet 2009
Statut
Membre
Dernière intervention
18 juin 2010

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...
Messages postés
13
Date d'inscription
lundi 13 juillet 2009
Statut
Membre
Dernière intervention
18 juin 2010

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...