Extrait de MDSN:
L'objet String est immuable. Chaque fois que vous utilisez l'une des méthodes de la classe System.String, vous créez un nouvel objet
chaîne en mémoire, ce qui requiert une nouvelle allocation d'espace pour ce nouvel objet. Dans les cas où vous devez effectuer
des modifications répétées d'une chaîne, la surcharge associée à la création d'un nouvel objet String peut être élevée.
Vous pouvez utiliser la classe System.Text.StringBuilder pour modifier une chaîne sans créer de nouvel objet. Par exemple, l'utilisation
de la classe StringBuilder peut optimiser les performances lorsqu'il s'agit de concaténer de nombreuses chaînes dans une boucle.
J'aimerais bien en crée un, ce que j'ai commencer à faire mais ya des problèmes:
http://www.purebasic.fr/french/viewtopi ... =1&t=15487
Comment vous, vous procéderiez pour faire cette objet ?
Voici mon code:
Code : Tout sélectionner
Structure MyStringBuilder
MyStringBuilderAllocateMemory.B
*MyStringBuilderMemoryID
MyStringBuilderSize.I
MyStringBuilderRemaining.I
MyStringBuilderPosition.I
EndStructure
Global MyStringBuilder.MyStringBuilder
Procedure.B IsStringBuilder()
If MyStringBuilder\MyStringBuilderAllocateMemory = #True And MyStringBuilder\MyStringBuilderMemoryID <> 0
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure.I InitialiseStringBuilder(Taille.I = 1000)
If Taille.I <= 0
Taille.I = 1
EndIf
If Not IsStringBuilder()
MyStringBuilder\MyStringBuilderMemoryID = AllocateMemory(Taille.I)
If MyStringBuilder\MyStringBuilderMemoryID <> 0
MyStringBuilder\MyStringBuilderAllocateMemory = #True
MyStringBuilder\MyStringBuilderRemaining = MemorySize(MyStringBuilder\MyStringBuilderMemoryID)
MyStringBuilder\MyStringBuilderSize = MemorySize(MyStringBuilder\MyStringBuilderMemoryID)
MyStringBuilder\MyStringBuilderPosition = 0
ProcedureReturn MyStringBuilder\MyStringBuilderRemaining
Else
ProcedureReturn 0
EndIf
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure.B StringBuilderClearString(Taille.I = 1000)
If Taille.I <= 0
Taille.I = 1
EndIf
If IsStringBuilder()
FreeMemory(MyStringBuilder\MyStringBuilderMemoryID)
MyStringBuilder\MyStringBuilderAllocateMemory = #False
MyStringBuilder\MyStringBuilderMemoryID = 0
MyStringBuilder\MyStringBuilderSize = 0
MyStringBuilder\MyStringBuilderRemaining = 0
MyStringBuilder\MyStringBuilderPosition = 0
If InitialiseStringBuilder(Taille.I)
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure.I StringBuilderAddString(String.s)
If IsStringBuilder()
If Len(String.s) > MyStringBuilder\MyStringBuilderRemaining.I
MyStringBuilder\MyStringBuilderMemoryID = ReAllocateMemory(MyStringBuilder\MyStringBuilderMemoryID, MemorySize(MyStringBuilder\MyStringBuilderMemoryID) + (Len(String.s) * 10))
If MyStringBuilder\MyStringBuilderMemoryID <> 0
MyStringBuilder\MyStringBuilderRemaining = MemorySize(MyStringBuilder\MyStringBuilderMemoryID) - MyStringBuilder\MyStringBuilderPosition
MyStringBuilder\MyStringBuilderSize = MemorySize(MyStringBuilder\MyStringBuilderMemoryID)
OctetsWrite = PokeS(MyStringBuilder\MyStringBuilderMemoryID + MyStringBuilder\MyStringBuilderPosition, String.s, -1, #PB_Ascii | #PB_String_NoZero)
MyStringBuilder\MyStringBuilderRemaining - OctetsWrite
MyStringBuilder\MyStringBuilderPosition + OctetsWrite
ProcedureReturn OctetsWrite
Else
ProcedureReturn 0
EndIf
Else
OctetsWrite = PokeS(MyStringBuilder\MyStringBuilderMemoryID + MyStringBuilder\MyStringBuilderPosition, String.s, -1, #PB_Ascii | #PB_String_NoZero)
MyStringBuilder\MyStringBuilderRemaining - OctetsWrite
MyStringBuilder\MyStringBuilderPosition + OctetsWrite
ProcedureReturn OctetsWrite
EndIf
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure.S StringBuilderGetString()
If IsStringBuilder()
ProcedureReturn PeekS(MyStringBuilder\MyStringBuilderMemoryID)
Else
ProcedureReturn ""
EndIf
EndProcedure
Procedure.I StringBuilderGetMemoryID()
If IsStringBuilder()
ProcedureReturn MyStringBuilder\MyStringBuilderMemoryID
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure.I StringBuilderGetMemorySize()
If IsStringBuilder()
ProcedureReturn MyStringBuilder\MyStringBuilderSize
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure.I StringBuilderGetMemoryRemaining()
If IsStringBuilder()
ProcedureReturn MyStringBuilder\MyStringBuilderRemaining
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure.I StringBuilderGetMemoryPosition()
If IsStringBuilder()
ProcedureReturn MyStringBuilder\MyStringBuilderPosition
Else
ProcedureReturn 0
EndIf
EndProcedure
Abc$ = "Abcdefghijklmnopqrstuvwxyz"
If InitialiseStringBuilder() And IsStringBuilder()
MessageRequester("StringBuilder Initialisation...", "StringBuilder MemoryID = " + Str(StringBuilderGetMemoryID()) + Chr(13) + Chr(10) +
"StringBuilder Memory Size = " + Str(StringBuilderGetMemorySize()) + Chr(13) + Chr(10) +
"StringBuilder Memory Remaining = " + Str(StringBuilderGetMemoryRemaining()) + Chr(13) + Chr(10) +
"StringBuilder Memory Position = " + Str(StringBuilderGetMemoryPosition()))
Time1 = ElapsedMilliseconds()
For I = 1 To 100000
MemoryID = StringBuilderGetMemoryID()
MemorySize = StringBuilderGetMemorySize()
MemoryRemaining = StringBuilderGetMemoryRemaining()
MemoryPosition = StringBuilderGetMemoryPosition()
OctetsWrite = StringBuilderAddString(Abc$)
Next
Time2 = ElapsedMilliseconds()
MessageRequester("StringBuilder Résultat...", "StringBuilder MemoryID = " + Str(StringBuilderGetMemoryID()) + Chr(13) + Chr(10) +
"StringBuilder Memory Size = " + Str(StringBuilderGetMemorySize()) + Chr(13) + Chr(10) +
"StringBuilder Memory Remaining = " + Str(StringBuilderGetMemoryRemaining()) + Chr(13) + Chr(10) +
"StringBuilder Memory Position = " + Str(StringBuilderGetMemoryPosition()) + Chr(13) + Chr(10) +
"StringBuilder Last Octets Write = " + Str(OctetsWrite) + Chr(13) + Chr(10) +
"Time Elapsed = " + Str(Time2 - Time1) + " Ms.")
Else
MessageRequester("StringBuilder Résultat...", "Erreur, Le StringBuilder n'a pas put être initialisé !", 16)
EndIf