Soyez le premier à donner votre avis sur cette source.
Snippet vu 3 572 fois - Téléchargée 31 fois
Option Explicit 'FORM Private Sub Form_Load() 'Definir mon tableau de caracteres Dim MonTableau() As String 'variable pour les besoins de la boucle vTmp Dim vTmp As Variant Dim Msg As String 'remplir mon tableau en fonction de la procedure Remplir MonTableau 'afficher le contenu de mon tableau dans un message box For Each vTmp In MonTableau Msg = Msg + vTmp + vbLf Next vTmp MsgBox Msg End 'That's all End Sub 'PROCEDURE 'le type doit etre obligatoirement variant car 'un tableau de string n'est pas de type string Sub Remplir(MonTableauProcedure As Variant) 'byRef par defaut Dim I As Long 'Index For I = 0 To 10 'redimentionner le tableau et conserver les valeurs deja contenues ReDim Preserve MonTableauProcedure(I) 'affecter un caractere de A a .. X fonction de l'index I MonTableauProcedure(I) = Chr(Asc("A") + I) Next I End Sub
28 nov. 2003 à 14:00
Pour ta deuxième solution, évite de laisser gérer au vb la taille des tableaux, je m'explique
en non compilé, les tableaux sont gérés par les dll du vb, et provoquent une erreur en cas de dépassement de capacité
en compilé, ça ne marche pas pareil ! Tu peux activer ou désactiver une option de compilation qui active ou désactive cette erreur.
En plus, la gestion d'erreur prend du temps (c'est un test, c'est vrai que depuis le pentium ça va plus vite, mais quand même)
Teste donc toi même la taille du tableau pour savoir si tu dois le redimenssionner !!!
28 nov. 2003 à 13:16
mais je suis comme St Thomas... les resultats parlent d'eux meme
(Je n'ai pas essaye la compil)
Si la source vous interresse, elle est en dessous mais elle n'est pas commentee.
Un merci special a Warny pour son Chr$ du quick Basic. je prepare un autre test pour verif in visu.
----------------------------
Tableau de 100000 elements.
Variant byref pas ReDim 1000 = 0,25
Variant byref pas ReDim 900 = 0,281
Variant byref pas ReDim 800 = 0,281
Variant byref pas ReDim 700 = 0,313
Variant byref pas ReDim 600 = 0,359
Variant byref pas ReDim 500 = 0,344
Variant byref pas ReDim 400 = 0,406
Variant byref pas ReDim 300 = 0,485
Variant byref pas ReDim 200 = 0,609
Variant byref pas ReDim 100 = 0,797
Static String Byref = 0,187
Static Variant Byref =0,203
LA SOURCE :
Option Explicit
Const INDEX_INCONNU As Long = 100000
Dim Debut As Double, Pas As Long, Temps As Double
Dim J As Long, I As Long
Private Type StructArray
Dynamic() As String
End Type
Dim Arrays(1 To 10) As StructArray
Dim TblStatic(INDEX_INCONNU) As String
Dim TblStatic2(INDEX_INCONNU) As String
Private Sub Form_Load()
Debug.Print "----------------------------"
Debug.Print "Tableau de " + Str$(INDEX_INCONNU) + " elements."
'pour etre sur que le pas ne depend pas de l'ordre d'affectation
For I = 10 To 1 Step -1
Pas = Abs(100 * I)
CallVariant Arrays(I).Dynamic
Debug.Print "Variant byref pas ReDim" + _
Str$(Pas) + " = " + Format$(Temps, "0.###")
Next I
CallStaticStringByref TblStatic
Debug.Print "Static String Byref = " + Format$(Temps, "0.###")
CallStaticVariantByref TblStatic2
Debug.Print "Static Variant Byref =" + Format$(Temps, "0.###")
End
End Sub
Sub CallVariant(Tableu As Variant)
On Local Error GoTo ErrHandel
ReDim Preserve Tableu(Pas)
Debut = Timer
For J = 0 To INDEX_INCONNU
Tableu(J) = Str$(J)
Next J
Temps = Timer - Debut
Exit Sub
ErrHandel:
If Err.Number = 9 Then
ReDim Preserve Tableu(UBound(Tableu) + Pas)
Resume
End If
End Sub
Sub CallStaticStringByref(Tableu() As String)
Debut = Timer
For J = 0 To INDEX_INCONNU
Tableu(J) = Str$(J)
Next J
Temps = Timer - Debut
Exit Sub
End Sub
Sub CallStaticVariantByref(Tableu As Variant)
Debut = Timer
For J = 0 To INDEX_INCONNU
Tableu(J) = Str$(J)
Next J
Temps = Timer - Debut
Exit Sub
End Sub
26 nov. 2003 à 21:47
Pour le type, c'est vrai que Variant laisse à désirer....
6/10
Saros
26 nov. 2003 à 08:51
- Même si tu ne connais pas à l'avance la taille de ton tableau, si tu utilise plusieurs itérations pour le dimensionner, définit une taille assez grande, puis réduit la en fin de traitement.
- Les variants ne sont pas typés par défaut. Avant leur utilisation, un typecast implicite est quasiment toujours effectué. Or celui-ci est très gourmand en temps. (PS pour EBArtSoft dans le même esprit il faut utliser Chr$ plutot que Chr, cher vieux basic quand tu nous tiens)
25 nov. 2003 à 23:39
pour passer un tableau rien de plus simple :
dim MonTableau() as string
sub FuncAvecTbl(byref Tableu() as string )
rem Ya plus qu'a
end sub
du plus "'un tableau de string n'est pas de type string" est une
phrase qui ne veus pas dire grand chose mais si c'est ta
philosophie alors...
sinons c'est pas la peine de redimentionner ton tableau
a chaque cycle de ta boucle si tu connais a l'avance le nombre de cycle
fait seulement :
redim mon tableau(10)
for i=0 to 10
'....
next
et on peut faire de meme pour le asc()
a=asc("A")
for i=0 to 10
Tbl(i)=chr(a+i)
next
It is so simple... lol
@+
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.