CHARGER UN TABLEU DYNAMIQUE DANS UNE PROCEDURE (BYREF)

cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 - 25 nov. 2003 à 23:39
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015 - 28 nov. 2003 à 14:00
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/18217-charger-un-tableu-dynamique-dans-une-procedure-byref

cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
28 nov. 2003 à 14:00
Salut,
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 !!!
zoubi57 Messages postés 10 Date d'inscription jeudi 16 mai 2002 Statut Membre Dernière intervention 17 octobre 2019
28 nov. 2003 à 13:16
Merci a tous pour la pertinence de vous observations.
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
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
26 nov. 2003 à 21:47
Une optimisation possible serait de rajouter 10 cases toutes les 10 itérations (voire même plus) et de bien redimensionner le tableau à la fin.
Pour le type, c'est vrai que Variant laisse à désirer....
6/10
Saros
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
26 nov. 2003 à 08:51
La redéfinition et le redimensionnement de variables est une opération assez gourmande en temps. Ton programme souffre donc de deux défauts :
- 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)
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
25 nov. 2003 à 23:39
Je vois pas ou est le mystere avec les tableaux ?

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

@+