OVH Cloud OVH Cloud

Variable vide

11 réponses
Avatar
Daniel AUBRY
Bonjour à tous,

j'ai une variable :

Dim MaVariable() as Integer

dans mon code elle n'est pas forcément incrémentée.

Par contre je la teste à un certain moment et :

PlusFort = UBound(MaVariable)

me plante si elle n'a pas été incrémentée.

Je ne saisi comment testé ma variable, j'ai tenté
If MaVariable is not Nothing sans succès.

Si quelqu'un a une p'tite idée ........

Marci d'avance,

dany

10 réponses

1 2
Avatar
LE TROLL
Salut,

Je crois que c'est un tableau vide la forme v()
Il faut me semble-t-il l'initialiser par ReDim, soit:

Dim MaVariable() As Integer
...............
ReDim MaVariable(1) As Integer
MaVariable(1) = x

---------------------

"Daniel AUBRY" a écrit dans le message de news:
431091c8$0$1827$
Bonjour à tous,

j'ai une variable :

Dim MaVariable() as Integer

dans mon code elle n'est pas forcément incrémentée.

Par contre je la teste à un certain moment et :

PlusFort = UBound(MaVariable)

me plante si elle n'a pas été incrémentée.

Je ne saisi comment testé ma variable, j'ai tenté
If MaVariable is not Nothing sans succès.

Si quelqu'un a une p'tite idée ........

Marci d'avance,

dany






Avatar
David
Bonjour Daniel,

UBound c'est pour le stableaux.

Dim mavariable
Dim tableau(10)
mavariable = UBound(AnyArray) ' Renvoie 10.

a+
Jean-Pol DAVID
ICQ 28394733
--
Quis ? Quid ? Ubi ? Quibus auxiliis ? Cur ? Quomodo ? Quando ?
"Daniel AUBRY" a écrit dans le message de news:
431091c8$0$1827$
Bonjour à tous,

j'ai une variable :

Dim MaVariable() as Integer

dans mon code elle n'est pas forcément incrémentée.

Par contre je la teste à un certain moment et :

PlusFort = UBound(MaVariable)

me plante si elle n'a pas été incrémentée.

Je ne saisi comment testé ma variable, j'ai tenté
If MaVariable is not Nothing sans succès.

Si quelqu'un a une p'tite idée ........

Marci d'avance,

dany






Avatar
David
Bonjour Daniel,
Erreur de copier/coller!

UBound c'est pour les tableaux.

Dim mavariable
Dim tableau(10)
mavariable = UBound(TABLEAU) ' Renvoie 10.


a+
Jean-Pol DAVID
ICQ 28394733
--
Quis ? Quid ? Ubi ? Quibus auxiliis ? Cur ? Quomodo ? Quando ?
"Daniel AUBRY" a écrit dans le message de news:
431091c8$0$1827$
Bonjour à tous,

j'ai une variable :

Dim MaVariable() as Integer

dans mon code elle n'est pas forcément incrémentée.

Par contre je la teste à un certain moment et :

PlusFort = UBound(MaVariable)

me plante si elle n'a pas été incrémentée.

Je ne saisi comment testé ma variable, j'ai tenté
If MaVariable is not Nothing sans succès.

Si quelqu'un a une p'tite idée ........

Marci d'avance,

dany






Avatar
scraper
Bonjour Daniel AUBRY, dans le message
news:431091c8$0$1827$
tu disais :


Bonjour à tous,

j'ai une variable :

Dim MaVariable() as Integer

dans mon code elle n'est pas forcément incrémentée.

Par contre je la teste à un certain moment et :

PlusFort = UBound(MaVariable)

me plante si elle n'a pas été incrémentée.

Je ne saisi comment testé ma variable, j'ai tenté
If MaVariable is not Nothing sans succès.

Si quelqu'un a une p'tite idée ........

Marci d'avance,

dany



puisque c'est un integer, tant qu'une valeur lui a pas été affectée
explicitement, et du moment que tu l'as déclarée, ta variable vaut 0

il suffit donc de faire par exemple

If PlusFort<>0 Then
'traitement
...
End If


--

Adresse invalide
Merci de répondre sur le forum ...
http://scraper.chez.tiscali.fr

scraper
Avatar
ng
Salut,

Dim MaVariable() as Integer

dans mon code elle n'est pas forcément incrémentée.

Par contre je la teste à un certain moment et :

PlusFort = UBound(MaVariable)




Il faut tester si le tableau a été initialisé avec une fonction du style :

Function EstInitialise(tbl() As Integer) As Boolean
On Error Resume Next
Dim lTest As Long
lTest = Ubound(tbl)
EstInitialise = (Err.Number > 0)
End Function


Ainsi :

Dim monTbl() As Integer

If EstInitialise(monTbl) Then
'c'est bon on peut s'en servir, faire des UBound() & co
Else
'c'est pas bon il faut l'initialisé :
Redim monTbl(1)
End If

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
Avatar
scraper
[...]

oops, pas vu que ta variable était un tableau

désolé



--

Adresse invalide
Merci de répondre sur le forum ...
http://scraper.chez.tiscali.fr

scraper
Avatar
Picalausa François
Hello,

Il y a des méthodes plus ou moins clean pour tester si une array est ou non
initialisée.
La méthode la simple est d'ignorer l'erreur.
Voici un exemple:

Public Function intSafeUbound(ArrayName() As Integer, Optional dimension As
Long = 1) As Long
On Error Resume Next
bytSafeUbound = -1
bytSafeUbound = UBound(ArrayName, dimension)
End Function

Public Function intSafeLbound(ArrayName() As Integer, Optional dimension As
Long = 1) As Long
On Error Resume Next
bytSafeLbound = 0
bytSafeLbound = LBound(ArrayName, dimension)
End Function

Il est possible de tester ces bornes par d'autres manières. Une méthode qui
ne gère pas l'erreur consiste à retrouver un pointeur vers le safearray.
Celui ci est nul lorsque l'array n'est pas initialisée. Voici un exemple:
Private Type SAFEARRAYBOUND
cElements As Long
lLbound As Long
End Type

Private Type SAFEARRAY
cDims As Integer
fFeatures As Integer
cbElements As Long
cLocks As Long
pvData As Long
End Type

Private Declare Function VarPtrArray _
Lib "msvbvm60.dll" _
Alias "VarPtr" _
( _
Var() As Any _
) _
As Long
Private Declare Sub CopyMemory _
Lib "kernel32" _
Alias "RtlMoveMemory" _
( _
ByRef Destination As Any, _
ByRef Source As Any, _
ByVal Length As Long _
)

Private Sub Form_Load()
Dim MyInts() As Integer

DoSomething MyInts

ReDim MyInts(0)

DoSomething MyInts
End Sub

Public Sub DoSomething(DataArray() As Integer)
Dim VBArray As SAFEARRAY, ArrayBounds() As SAFEARRAYBOUND
Dim ArrayPointer As Long

'Transforme le pointeur vers un pointeur en pointeur simple
Call CopyMemory(ArrayPointer, ByVal VarPtrArray(DataArray),
LenB(ArrayPointer))

If ArrayPointer Then
Call CopyMemory(VBArray, ByVal ArrayPointer, LenB(VBArray))

If VBArray.cDims Then
ReDim ArrayBounds(VBArray.cDims)

Call CopyMemory(ArrayBounds(0), ByVal ArrayPointer +
LenB(VBArray), LenB(ArrayBounds(0)) * VBArray.cDims)

MsgBox "L'array possède " & VBArray.cDims & " dimensions (1ère
dim : " & ArrayBounds(0).lLbound & " To " & ArrayBounds(0).lLbound +
ArrayBounds(0).cElements - 1 & ")"
End If
Else
MsgBox "L'array n'est pas initialisée"
End If
End Sub

--
Picalausa François

"Daniel AUBRY" a écrit dans le message de news:
431091c8$0$1827$
Bonjour à tous,

j'ai une variable :

Dim MaVariable() as Integer

dans mon code elle n'est pas forcément incrémentée.

Par contre je la teste à un certain moment et :

PlusFort = UBound(MaVariable)

me plante si elle n'a pas été incrémentée.

Je ne saisi comment testé ma variable, j'ai tenté
If MaVariable is not Nothing sans succès.

Si quelqu'un a une p'tite idée ........

Marci d'avance,

dany






Avatar
Daniel AUBRY
Ok, merci, j'applique de suite.

dany

"ng" a écrit dans le message de news:

Salut,

Dim MaVariable() as Integer

dans mon code elle n'est pas forcément incrémentée.

Par contre je la teste à un certain moment et :

PlusFort = UBound(MaVariable)




Il faut tester si le tableau a été initialisé avec une fonction du style :

Function EstInitialise(tbl() As Integer) As Boolean
On Error Resume Next
Dim lTest As Long
lTest = Ubound(tbl)
EstInitialise = (Err.Number > 0)
End Function


Ainsi :

Dim monTbl() As Integer

If EstInitialise(monTbl) Then
'c'est bon on peut s'en servir, faire des UBound() & co
Else
'c'est pas bon il faut l'initialisé :
Redim monTbl(1)
End If

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/


Avatar
Guy DETIENNE
Salut ;O)

Dans le même esprit que les réponses précédentes :

Determining the size of a VB dynamic array
http://www.developerfusion.co.uk/show/1136/

Guy


"Daniel AUBRY" a écrit dans le message de
news:431091c8$0$1827$
Bonjour à tous,

j'ai une variable :

Dim MaVariable() as Integer

dans mon code elle n'est pas forcément incrémentée.

Par contre je la teste à un certain moment et :

PlusFort = UBound(MaVariable)

me plante si elle n'a pas été incrémentée.

Je ne saisi comment testé ma variable, j'ai tenté
If MaVariable is not Nothing sans succès.

Si quelqu'un a une p'tite idée ........

Marci d'avance,

dany






Avatar
Guy DETIENNE
Salut ;O)

Une collection c'est bien mais c'est très lent par rapport à un tableau
lorsque l'optimisation est de mise.
Donc à utiliser selon les cas...

Guy


"<pasdespam> @wanadoo.fr>" <"<pasdespam> a écrit dans le message de
news:4313004c$0$17243$
Picalausa François a écrit :

> Il est possible de tester ces bornes par d'autres manières. Une méthode


qui
> ne gère pas l'erreur consiste à retrouver un pointeur vers le safearray.
> Celui ci est nul lorsque l'array n'est pas initialisée. Voici un


exemple:
> Private Type SAFEARRAYBOUND
> cElements As Long
> lLbound As Long
> End Type
>
> Private Type SAFEARRAY
> cDims As Integer
> fFeatures As Integer
> cbElements As Long
> cLocks As Long
> pvData As Long
> End Type
>
> Private Declare Function VarPtrArray _
> Lib "msvbvm60.dll" _
> Alias "VarPtr" _
> ( _
> Var() As Any _
> ) _
> As Long
> Private Declare Sub CopyMemory _
> Lib "kernel32" _
> Alias "RtlMoveMemory" _
> ( _
> ByRef Destination As Any, _
> ByRef Source As Any, _
> ByVal Length As Long _
> )
>
> Private Sub Form_Load()
> Dim MyInts() As Integer
>
> DoSomething MyInts
>
> ReDim MyInts(0)
>
> DoSomething MyInts
> End Sub
>
> Public Sub DoSomething(DataArray() As Integer)
> Dim VBArray As SAFEARRAY, ArrayBounds() As SAFEARRAYBOUND
> Dim ArrayPointer As Long
>
> 'Transforme le pointeur vers un pointeur en pointeur simple
> Call CopyMemory(ArrayPointer, ByVal VarPtrArray(DataArray),
> LenB(ArrayPointer))
>
> If ArrayPointer Then
> Call CopyMemory(VBArray, ByVal ArrayPointer, LenB(VBArray))
>
> If VBArray.cDims Then
> ReDim ArrayBounds(VBArray.cDims)
>
> Call CopyMemory(ArrayBounds(0), ByVal ArrayPointer +
> LenB(VBArray), LenB(ArrayBounds(0)) * VBArray.cDims)
>
> MsgBox "L'array possède " & VBArray.cDims & " dimensions


(1ère
> dim : " & ArrayBounds(0).lLbound & " To " & ArrayBounds(0).lLbound +
> ArrayBounds(0).cElements - 1 & ")"
> End If
> Else
> MsgBox "L'array n'est pas initialisée"
> End If
> End Sub
>


Joli !

Pour ma part et dans la mesure du possible j'utilise des collections, le
is nothing étant Object...ivement plus parlant.

Et une des raisons première était le fait de trapper l'erreur sur
ubound() pour chaque variable tableau générale.

Christophe

A+



1 2