Charger un tableu dynamique dans une procedure (byref)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 3 372 fois - Téléchargée 30 fois

Contenu du snippet

Apres avoir lu la litterature sur le site concernant le passage de tableaux a une procedure je pense qu'il faut remettre l'eglise au milieu du village.
En fait tout tient dans la definition des variables.

it's so simple

P.S. desole pour les accents mais je n'ai qu'un clavier QWERTY

Source / Exemple :


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

Conclusion :


Si vous pensez que ce prog est inutile expliquez-vous.
Allez-y vous pouvez charger la mule...
mais c'est du beton.

A voir également

Ajouter un commentaire Commentaires
Messages postés
473
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015

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 !!!
Messages postés
10
Date d'inscription
jeudi 16 mai 2002
Statut
Membre
Dernière intervention
17 octobre 2019

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
Messages postés
921
Date d'inscription
vendredi 20 décembre 2002
Statut
Membre
Dernière intervention
23 septembre 2010

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
Messages postés
473
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015

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)
Messages postés
4525
Date d'inscription
dimanche 29 septembre 2002
Statut
Modérateur
Dernière intervention
22 avril 2019
9
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

@+

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.