StringBuilder

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Brayane
Messages : 54
Inscription : jeu. 27/août/2015 14:08

StringBuilder

Message par Brayane »

Salut, en PB, il n'y a pas de chose de type StringBuilder:

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
Dernière modification par Brayane le dim. 20/sept./2015 17:38, modifié 3 fois.
Brayane
Messages : 54
Inscription : jeu. 27/août/2015 14:08

Re: StringBuilder

Message par Brayane »

Ty est pas du tout là, mais tient tu as raison et je te le prouve:

Code : Tout sélectionner

For I = 1 To 100000
  A$ + "Abcdef"
Next
Combien de temps ça met ça chez toi à s’exécute juste pour savoir ?
Un truc du style, 10 Sec.

Tu pense pas que ya plus rapide ?
Test mon code plus haut et dis moi si c'est pas mieux :wink:
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: StringBuilder

Message par nico »

Brayanne,

Dans ton code, quand on fais un debug Resultat$ après le next, eh bien, on a n'importe quoi. !!!???
Brayane
Messages : 54
Inscription : jeu. 27/août/2015 14:08

Re: StringBuilder

Message par Brayane »

Nico, non pas n'importe quoi mais des informations:

Taille de la mémoire totale (Du StringBuilder)
Nombre d'Octets écris
Octets restants (De libre)

Code revue et amélioré.
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: StringBuilder

Message par Micheao »

Brayane a écrit :Ty est pas du tout là, mais tient tu as raison et je te le prouve:

Code : Tout sélectionner

For I = 1 To 100000
  A$ + "Abcdef"
Next
Combien de temps ça met ça chez toi à s’exécute juste pour savoir ?
Un truc du style, 10 Sec.

Tu pense pas que ya plus rapide ?
Test mon code plus haut et dis moi si c'est pas mieux :wink:

Brayane Si tu crois qu'il ya plus rapide Participe au concours Birthday PurePunch et montre nous un peu ce que tu sais faire .
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: StringBuilder

Message par nico »

Tu le fais exprès de pas comprendre, dans le précédent code, tu as écrit:

Code : Tout sélectionner

For I = 1 To 100000
  
  Resultat$ = StringBuilderAddString(Abc$)
  
  TailleMemoire$ = StringField(Resultat$, 1, ".")
  OctetsEcrit$ = StringField(Resultat$, 2, ".")
  MemoireRestante$ = StringField(Resultat$, 3, ".")
  
Next
Alors je fais ça, je rajoute un Debug Resultat$ afin de voir si effectivement la fonction donne le résultat attendu, soit:

Code : Tout sélectionner

For I = 1 To 100000
  
  Resultat$ = StringBuilderAddString(Abc$)
  
  TailleMemoire$ = StringField(Resultat$, 1, ".")
  OctetsEcrit$ = StringField(Resultat$, 2, ".")
  MemoireRestante$ = StringField(Resultat$, 3, ".")
  
Next

Debug Resultat$
Et le résultat me donne ça:

Code : Tout sélectionner

2600000.26.0
Au lieu de ça, j'imagine:

Code : Tout sélectionner

AbcdefghijklmnopqrstuvwxyzAbcdefghijklmnopqrstuvwxyzAbcdefghijklmnopqrstuvwxyzAbcdefghijklmnopqrstuvwxyz... etc, etc
Brayane
Messages : 54
Inscription : jeu. 27/août/2015 14:08

Re: StringBuilder

Message par Brayane »

Micheao -> Tu sais, je ne suis pas très calé moi hein, j'me débrouille c'est tout :)
Nico, non c'est toi qui ne comprends pas désolé ^^

Mais le code a été mis à jours depuis :)
Dernière modification par Brayane le dim. 20/sept./2015 17:59, modifié 1 fois.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: StringBuilder

Message par nico »

Tu ne répond pas, quel est le résultat attendu?.

Cela t'arrive t'il de tester tes propres codes?
Brayane
Messages : 54
Inscription : jeu. 27/août/2015 14:08

Re: StringBuilder

Message par Brayane »

Nico:
2600000.26.0
=
Taille de la mémoire totale (Du StringBuilder)
Nombre d'Octets écris
Octets restants (De libre)
Tu ne répond pas, quel est le résultat attendu?.

Cela t'arrive t'il de tester tes propres codes?
Nico t'es un peu agressif la mon cher, laisse moi le temps d'écrire XD :lol:
Le résulta qui était attendus, je te l'es dis !

Nico, nan je teste jamais mes code ça sert a rien :lol:
Évidement que je les test et je t'es répondus :)

La fonction renvoyais une chaîne de caractères avec:
Taille de la mémoire totale (Du StringBuilder)
Nombre d'Octets écris
Octets restants (De libre)
2600000.26.0
J'ai corrigé tous ça et j'ai changé des choses car cela ne me convenais pas :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: StringBuilder

Message par nico »

Ce code est celui de Micoute?
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: StringBuilder

Message par nico »

On dirait un code repris de Fenic, http://www.purebasic.fr/english/viewtop ... ng+Builder.

Si le code existe déjà et qu'en plus tu le reprends, ça sert a quoi tout ça, a part faire perdre du temps a tout le monde.
Brayane
Messages : 54
Inscription : jeu. 27/août/2015 14:08

Re: StringBuilder

Message par Brayane »

Nico, ce code n'est pas de Micoute mais de moi ;)
Tu ne me crois pas ?, tu lui demandera :)
De plus je n'est copier personne, ce code est 100% maison, pas de copie, même pas d'inspiration d'un autre code puisque je savais même pas :)
Tout est de moi ;)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: StringBuilder

Message par nico »

Dans ce cas, bravo, certainement l'un des meilleurs codes qui soit. :)
Brayane
Messages : 54
Inscription : jeu. 27/août/2015 14:08

Re: StringBuilder

Message par Brayane »

Tu veux dire quoi par la nico, c'est ironique ou c'est un compliment ?
Le meilleurs code qui soit ?
J'en doute, je ne suis pas un pro bien loin de la et ce code peut largement être amélioré !
Si c'est un compliment merci bien :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: StringBuilder

Message par nico »

Ce n'est pas ironique, cela a l'air de fonctionner (je n'ai pas pousser les tests) et le résultat par rapport à ce que donne PureBasic est stupéfiant.
Répondre