Je r'ouvre mon sujet, oui Brayane s'était moi, tous le monde le savais à la fin.
J'ai créer deux autre code, mais pour moi le dernier est le meilleurs:
Code : Tout sélectionner
Structure MyStringBuilder
*MyStringBuilderMemoryiD
MyStringBuilderSize.q
MyStringBuilderRemaining.q
MyStringBuilderPosition.q
EndStructure
Global Dim MyStringBuilder.MyStringBuilder(0)
Procedure.b initialiseStringBuilder(Taille.q)
If Taille.q <= 0
Taille.q = 1
EndIf
If ArraySize(MyStringBuilder(), 1) = -1
ProcedureReturn 0
EndIf
If MyStringBuilder.MyStringBuilder(0)\MyStringBuilderMemoryiD = 0
*MyStringBuilderMemoryiD = AllocateMemory(StringByteLength(Space(Taille.q), #PB_Unicode) + 2)
If *MyStringBuilderMemoryiD
MyStringBuilder.MyStringBuilder(0)\MyStringBuilderMemoryiD = *MyStringBuilderMemoryiD
MemorySize.q = MemorySize(MyStringBuilder.MyStringBuilder(0)\MyStringBuilderMemoryiD) / 2
MemorySize.q - 1
MyStringBuilder.MyStringBuilder(0)\MyStringBuilderRemaining = MemorySize.q
MyStringBuilder.MyStringBuilder(0)\MyStringBuilderSize = MemorySize.q
MyStringBuilder.MyStringBuilder(0)\MyStringBuilderPosition = 0
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure.b isStringBuilder(ElementiD.i)
ArraySize.i = ArraySize(MyStringBuilder(), 1)
If ArraySize.i = -1 Or ElementiD.i < 0 Or ElementiD.i > ArraySize.i
ProcedureReturn 0
EndIf
If MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD <> 0
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure.b StringBuilderAddElement(Taille.q)
ArraySize.i = ArraySize(MyStringBuilder(), 1)
If ArraySize.i = -1
ProcedureReturn 0
EndIf
ReDim MyStringBuilder.MyStringBuilder(ArraySize.i + 1)
*MyStringBuilderMemoryiD = AllocateMemory(StringByteLength(Space(Taille.q), #PB_Unicode) + 2)
If *MyStringBuilderMemoryiD
MyStringBuilder.MyStringBuilder(ArraySize.i + 1)\MyStringBuilderMemoryiD = *MyStringBuilderMemoryiD
MemorySize.q = MemorySize(MyStringBuilder.MyStringBuilder(ArraySize.i + 1)\MyStringBuilderMemoryiD) / 2
MemorySize.q - 1
MyStringBuilder.MyStringBuilder(ArraySize.i + 1)\MyStringBuilderRemaining = MemorySize.q
MyStringBuilder.MyStringBuilder(ArraySize.i + 1)\MyStringBuilderSize = MemorySize.q
MyStringBuilder.MyStringBuilder(ArraySize.i + 1)\MyStringBuilderPosition = 0
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
ProcedureReturn ElementiD.i + 1
EndProcedure
Procedure.b StringBuilderClearString(ElementiD.i)
If Not isStringBuilder(ElementiD.i)
ProcedureReturn 0
EndIf
MemorySize.q = MemorySize(MyStringBuilder.MyStringBuilder(ArraySize.i + 1)\MyStringBuilderMemoryiD) / 2
MemorySize.q - 1
FillMemory(MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD, MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderSize, #Null , #PB_Unicode)
MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderRemaining = MemorySize.q
MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderSize = MemorySize.q
MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderPosition = 0
ProcedureReturn 1
EndProcedure
Procedure.b StringBuilderReAllocate(ElementiD.i, Taille.q)
If Taille.q <= 0
Taille.q = 1
EndIf
If Not isStringBuilder(ElementiD.i)
ProcedureReturn 0
EndIf
*MyStringBuilderMemoryiD = ReAllocateMemory(MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD, Taille.q)
If *MyStringBuilderMemoryiD
MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD = *MyStringBuilderMemoryiD
MemorySize.q = MemorySize(MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD) / 2
MemorySize.q - 1
TailleActuel.q = MemorySize.q
NouvelleTaille.q = Taille.q
Restant.q = MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderRemaining
If TailleActuel.q > NouvelleTaille.q
Difference.q = TailleActuel.q - NouvelleTaille.q
Restant.q - Difference.q
If Restant.q < 0
MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderPosition + Restant.q
Restant.q = 0
EndIf
MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderRemaining = Restant.q
MyStringBuilder.MyStringBuilder(ArraySize.i + 1)\MyStringBuilderSize = Taille.q
ElseIf NouvelleTaille.q > TailleActuel.q
Difference.q = NouvelleTaille.q - TailleActuel.q
Restant.q + Difference.q
MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderRemaining = Restant.q
MyStringBuilder.MyStringBuilder(ArraySize.i + 1)\MyStringBuilderSize = Taille.q
EndIf
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure.b StringBuilderAddString(ElementiD.i, String.s)
If Not String.s > ""
ProcedureReturn 0
EndIf
If isStringBuilder(ElementiD.i)
If Len(String.s) > MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderRemaining
*MyStringBuilderMemoryiD = ReAllocateMemory(MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD, MemorySize(MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD) + (StringByteLength(String.s) * 10))
If *MyStringBuilderMemoryiD
MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD = *MyStringBuilderMemoryiD
MemorySize.q = MemorySize(MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD) / 2
MemorySize.q - 1
If PokeS(MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD + (MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderPosition * 2), String.s, -1, #PB_Unicode)
MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderRemaining = MemorySize.q - MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderPosition - Len(String.s)
MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderSize = MemorySize.q
MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderPosition + Len(String.s)
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
Else
ProcedureReturn 0
EndIf
Else
MemorySize.q = MemorySize(MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD) / 2
MemorySize.q - 1
If PokeS(MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD + (MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderPosition * 2), String.s, -1, #PB_Unicode)
MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderRemaining = MemorySize.q - MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderPosition - Len(String.s)
MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderSize = MemorySize.q
MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderPosition + Len(String.s)
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
EndIf
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure.S StringBuilderGetString(ElementiD.i)
If isStringBuilder(ElementiD.i)
ProcedureReturn PeekS(MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD, -1, #PB_Unicode)
Else
ProcedureReturn ""
EndIf
EndProcedure
Procedure.i StringBuilderGetMemoryiD(ElementiD.i)
If isStringBuilder(ElementiD.i)
ProcedureReturn MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderMemoryiD
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure.i StringBuilderGetMemorySize(ElementiD.i)
If isStringBuilder(ElementiD.i)
ProcedureReturn MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderSize
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure.i StringBuilderGetMemoryRemaining(ElementiD.i)
If isStringBuilder(ElementiD.i)
ProcedureReturn MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderRemaining
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure.i StringBuilderGetMemoryPosition(ElementiD.i)
If isStringBuilder(ElementiD.i)
ProcedureReturn MyStringBuilder.MyStringBuilder(ElementiD.i)\MyStringBuilderPosition
Else
ProcedureReturn 0
EndIf
EndProcedure
;
; Procedure.i StringBuilderDeletteElement()
;
;
;
; EndProcedure
;
; Procedure.i StringBuilderCopyElement()
;
;
;
; EndProcedure
Abc$ = "Abcdefghijklmnopqrstuvwxyz"
If initialiseStringBuilder(0)
For MonStringBuilder1.i = 0 To 5
If isStringBuilder(MonStringBuilder1.i)
MessageRequester("StringBuilder initialisation...", "StringBuilderID = " + Str(MonStringBuilder1.i) + Chr(13) + Chr(10) +
"StringBuilder MemoryiD = " + Str(StringBuilderGetMemoryiD(MonStringBuilder1.i)) + Chr(13) + Chr(10) +
"StringBuilder Memory Size = " + Str(StringBuilderGetMemorySize(MonStringBuilder1.i)) + Chr(13) + Chr(10) +
"StringBuilder Memory Remaining = " + Str(StringBuilderGetMemoryRemaining(MonStringBuilder1.i)) + Chr(13) + Chr(10) +
"StringBuilder Memory Position = " + Str(StringBuilderGetMemoryPosition(MonStringBuilder1.i)))
Time1 = ElapsedMilliseconds()
For i = 1 To 255
Write.b = StringBuilderAddString(MonStringBuilder1.i, Abc$)
MemoryiD.q = StringBuilderGetMemoryiD(MonStringBuilder1.i)
MemorySize.q = StringBuilderGetMemorySize(MonStringBuilder1.i)
MemoryRemaining.q = StringBuilderGetMemoryRemaining(MonStringBuilder1.i)
MemoryPosition.q = StringBuilderGetMemoryPosition(MonStringBuilder1.i)
;
; Debug "MemoryiD: " + Str(MemoryiD.q)
; Debug "MemorySize: " + Str(MemorySize.q)
; Debug "MemoryRemaining: " + Str(MemoryRemaining.q)
; Debug "MemoryPosition: " + Str(MemoryPosition.q)
; Debug "Write: " + Str(Write.b)
; Debug "---------------------------"
;
Next
Time2 = ElapsedMilliseconds()
MessageRequester("StringBuilder Résultat...", "StringBuilderID = " + Str(MonStringBuilder1.i) + Chr(13) + Chr(10) +
"StringBuilder MemoryiD = " + Str(StringBuilderGetMemoryiD(MonStringBuilder1.i)) + Chr(13) + Chr(10) +
"StringBuilder Memory Size = " + Str(StringBuilderGetMemorySize(MonStringBuilder1.i)) + Chr(13) + Chr(10) +
"StringBuilder Memory Remaining = " + Str(StringBuilderGetMemoryRemaining(MonStringBuilder1.i)) + Chr(13) + Chr(10) +
"StringBuilder Memory Position = " + Str(StringBuilderGetMemoryPosition(MonStringBuilder1.i)) + Chr(13) + Chr(10) +
"Time Elapsed = " + Str(Time2 - Time1) + " Ms.")
If StringBuilderAddElement(1)
Else
Debug 0
EndIf
Else
MessageRequester("StringBuilder Résultat...", "Erreur, Le StringBuilder n°" + Str(MonStringBuilder1.i) + ", n'a pas put être initialisé !", 16)
EndIf
Next
Else
MessageRequester("StringBuilder Résultat...", "Erreur, Le StringBuilder n'a pas put être initialisé !", 16)
EndIf
For i = 0 To 5
Debug StringBuilderGetString(I)
Debug "----------"
Next