Concaténation rapide de chaines (sans api)

Soyez le premier à donner votre avis sur cette source.

Vue 6 548 fois - Téléchargée 361 fois

Description

Sans API, et oui, ca m'arrive parfois de ne pas en utiliser :p

ici, une simple classe permettant de concaténer des chaines de caractères rapidement (très rapidement, en comparaison avec un simple & )

ne pas utiliser pour chaque concaténation que vous ferez, bien évidemment, mais pour a partit d'un nombre raisonnable de concaténation, le gain est sensible : la mémoire allouée n'a pas besoin d'être contigüe en mémoire, moins de données sont déplacées, etc

Source / Exemple :


Option Explicit

Private mxsValues() As String
Private mnCount As Long
Private mnCapacity As Long
Private mnLength As Long

'# Nombre de cases que l'on ajoute au tableau lorsqu'il est trop petit
Private Const BLOCKSIZE As Long = 250

'# Méthode qui permet l'ajout d'éléments dans le tampon
Public Sub Append(ByVal szString As String)
Dim nLength As Long
    nLength = Len(szString)
    If nLength Then
        If mnCount = mnCapacity Then
            '# Le tableau est trop petit...
            '# On agrandit sa taille de BLOCKSIZE
            ResizeArray
        End If
        
        mnLength = mnLength + nLength
        
        '# On ajoute notre chaine dans le tableau
        mxsValues(mnCount) = szString
        '# Et on incrémente le compteur
        mnCount = mnCount + 1
    End If
End Sub

'# Propriété par défault
'# on recolle simplement les morceaux...
Public Property Get Value() As String
Attribute Value.VB_UserMemId = 0
Attribute Value.VB_MemberFlags = "200"
    Value = Join(mxsValues, vbNullString)
End Property

'# On vide le buffer
Public Sub Clear()
    mnCount = 0
    mnLength = 0
    mnCapacity = 0
    Erase mxsValues
End Sub

Private Sub ResizeArray()
    ReDim Preserve mxsValues(mnCapacity + BLOCKSIZE - 1) As String
    mnCapacity = mnCapacity + BLOCKSIZE
End Sub

Public Property Get Length() As Long
    Length = mnLength
End Property

Private Sub Class_Terminate()
    Me.Clear
End Sub

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
232
Date d'inscription
mercredi 25 octobre 2000
Statut
Membre
Dernière intervention
5 octobre 2012

12/10 +1
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
bonne idée d'ajout
Messages postés
160
Date d'inscription
vendredi 27 janvier 2006
Statut
Membre
Dernière intervention
21 avril 2015

J'ai testé, c'est nickel ! 12/10 ! Lol!
J'ai juste ajouté dans la classe la propriété :

Public Sub Store(ByVal szString As String)
Clear
Append(szString)
End Sub

Merci encore !
Cordialement,
ym_trainz
Messages postés
160
Date d'inscription
vendredi 27 janvier 2006
Statut
Membre
Dernière intervention
21 avril 2015

Voilà qui va me débarrasser de ce fichu fichier tampon ! (j'allais finir par faire des trous sur les pistes du HDD ;-)

C'est vrai que la concaténation naïve genre A=A+B, c'est plus que long.
Le gain de temps est... inestimable !
Merci, cela m'évite de me prendre la tête avec un algo avec des mid$()

Cordialement,
ym_trainz
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
C'est vrai, tu as parfaitement raison !
@+
Afficher les 24 commentaires

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.