Réinitialisation de variables tableaux

AGLAS

XLDnaute Nouveau
Bonjour le forum,


Quelqu'un saurait-il comment réinitialiser une variable tableau correctement ? De ce que j'ai compris, l'instruction dim n'a qu'une portée déclarative, alors Redim redimensionne et prend obligatoirement une valeur ; si cette valeur est 0, l'occurence 0 est créée, ce qui est différent de vide (0 occurrences) du coup si l'on cherche à balayer le contenu cette variable tableau au moyen d'un For..Next par exemple, on aura bien une occurrence de traitée...). Moi ce que je cherche à faire c'est de l'initialiser comme elle peut l'être lors de la toute première fois, c'est à dire vide, de sorte que si la suite du traitement consiste à balayer son contenu au moyen d'un For i =0 to Ubound(Montab) celui-ci soit ignoré. J'ai essayé Redim Montab(-1) ou encore Erase Montab(), mais ça marche pas. Je précise que ma variable tableau est de type Integer bien qu'il me semble que cela ne soit pas important pour ce pb. Merci par avance au forum et à ses usagers.

Message édité par: AGLAS, à: 04/09/2005 17:08
 

MichelXld

XLDnaute Barbatruc
bonjour

si je ne dis pas de bétises ( je ne suis pas un spécialiste des tableaux ) :
Chaque élément d'un tableau numérique (type Integer) de taille fixe prend la valeur zéro par défaut et après un Erase

Option Explicit
Option Base 1

Sub Test1()
'controle valeurs par defaut dans tableau fixe de type Integer
Dim i As Byte
Dim Tableau(3) As Integer

For i = 1 To 3
MsgBox 'Valeur : ' & Tableau(i)
Next i
End Sub


Sub Test2()
Dim i As Byte
Dim Tableau(3) As Integer

For i = 1 To 3
Tableau(i) = i * 10
Next i

For i = 1 To 3
MsgBox Tableau(i)
Next i

Erase Tableau
'test apres Erase dans tableau fixe de type integer
'chaque element du tableau prend la valeur 0
MsgBox UBound(Tableau)
For i = 1 To 3
MsgBox 'Valeur Apres Erase : ' & Tableau(i)
Next i
End Sub


par contre si la taille du tableau est définie par la procedure , le tableau est totalement vidé après un Erase

Sub Test3()
Dim i As Byte
Dim Tableau() As Integer

For i = 1 To 3
ReDim Preserve Tableau(i)
Tableau(i) = i * 10
Next i

For i = 1 To 3
MsgBox Tableau(i)
Next i

Erase Tableau
'MsgBox UBound(Tableau) 'renvoie une erreur
'le tableau est vidé
End Sub



bonne soiree
MichelXld

Message édité par: michelxld, à: 04/09/2005 18:25
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour Aglas, le Forum


L'instruction 'Erase' est bien ce qu'il faut employer pour réinitialiser les éléments de tableaux de taille fixe et pour libèrer la mémoire allouée à un tableau dynamique...

Par contre on ne rédige pas cette Syntax : Erase Montab() mais juste ceci : Erase Montab

Par contre il semble exact que cette instruction va vider chaque élément contenu mais le tableau conservera le nombre d'enregistrements qui lui ont été affectés même si il sont tous remis à zéro ou de chaine de iongueur nulle (selon le type de tableau)

Je ne vois pas vraiment comment faire autrement qu'un Redim à zéro, et il est excat que si tu boucles dessus ensuite tu auras une occurence...

En fait si vraiment j'étais confronté à un tel sbinz, je passerai perso par une condition toute bête

Erase MonTab
TabErased = True


Puis plus loin si je dois boucler dessus, une condition

If Not TabErased Then
For i =0 to Ubound(Montab)
'etc...
Next
End If

Et sinon j'ai fait ce test pour Erase :

Sub TestMonTab()
Dim i As Integer
Dim MyTab() As Integer
Dim MyCount As Integer

For i = 1 To 100
ReDim Preserve MyTab(0, i - 1)
    MyTab(0, i - 1) = i
Next

For i = 0 To UBound(MyTab, 2)
    MyCount = MyCount + MyTab(0, i)
Next
MsgBox MyCount


Erase MyTab

'Ici plantage assuré !!!
   
For i = 0 To UBound(MyTab, 2)
        MyCount = MyCount + MyTab(0, i)
   
Next
    MsgBox MyCount



End Sub


Donc je ferai tout bêtement ainsi :

Sub TestMonTab()
Dim i As Integer
Dim MyTab() As Integer
Dim MyCount As Integer
Dim TabErased As Boolean

For i = 1 To 100
ReDim Preserve MyTab(0, i - 1)
    MyTab(0, i - 1) = i
Next

For i = 0 To UBound(MyTab, 2)
    MyCount = MyCount + MyTab(0, i)
Next
MsgBox MyCount


Erase MyTab
TabErased =
True


If Not TabErased Then
   
For i = 0 To UBound(MyTab, 2)
        MyCount = MyCount + MyTab(0, i)
   
Next
    MsgBox MyCount
End If

End Sub

Bonne Soirée
[ol]@+Thierry[/ol]
 

AGLAS

XLDnaute Nouveau
Merci à vous deux,

Effectivement lorsque l'on applique Erase à une variable tableau et que l'on tente de lire le son contenu, cela provoque un plantage C'est du moins ce qu'il se produit dans ma fonction. La solution consiste donc à redimensionner à 0 et à positionner un flag pour le cas où la variable n'a pas été alimentée...

Message édité par: AGLAS, à: 04/09/2005 23:57
 

Pièces jointes

  • Function2.zip
    41.3 KB · Affichages: 19

Discussions similaires

Statistiques des forums

Discussions
312 429
Messages
2 088 351
Membres
103 824
dernier inscrit
frederic.marien@proximus.