PureBasic

Forums PureBasic
Nous sommes le Jeu 21/Nov/2019 2:33

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 35 messages ]  Aller à la page 1, 2, 3  Suivante
Auteur Message
 Sujet du message: StringBuilder
MessagePosté: Dim 20/Sep/2015 15:28 
Hors ligne

Inscription: Jeu 27/Aoû/2015 14:08
Messages: 54
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:
viewtopic.php?f=1&t=15487

Comment vous, vous procéderiez pour faire cette objet ?
Voici mon code:
Code:
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 édition par Brayane le Dim 20/Sep/2015 17:38, édité 3 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Dim 20/Sep/2015 16:08 
Hors ligne

Inscription: Jeu 27/Aoû/2015 14:08
Messages: 54
Ty est pas du tout là, mais tient tu as raison et je te le prouve:
Code:
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:


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Dim 20/Sep/2015 17:32 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 13/Fév/2004 0:57
Messages: 3702
Brayanne,

Dans ton code, quand on fais un debug Resultat$ après le next, eh bien, on a n'importe quoi. !!!???


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Dim 20/Sep/2015 17:38 
Hors ligne

Inscription: Jeu 27/Aoû/2015 14:08
Messages: 54
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é.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Dim 20/Sep/2015 17:48 
Hors ligne

Inscription: Dim 07/Déc/2014 10:12
Messages: 533
Localisation: Sud-Est
Brayane a écrit:
Ty est pas du tout là, mais tient tu as raison et je te le prouve:
Code:
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 .


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Dim 20/Sep/2015 17:57 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 13/Fév/2004 0:57
Messages: 3702
Tu le fais exprès de pas comprendre, dans le précédent code, tu as écrit:

Code:
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:
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:
2600000.26.0


Au lieu de ça, j'imagine:
Code:
AbcdefghijklmnopqrstuvwxyzAbcdefghijklmnopqrstuvwxyzAbcdefghijklmnopqrstuvwxyzAbcdefghijklmnopqrstuvwxyz... etc, etc


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Dim 20/Sep/2015 17:58 
Hors ligne

Inscription: Jeu 27/Aoû/2015 14:08
Messages: 54
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 édition par Brayane le Dim 20/Sep/2015 17:59, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Dim 20/Sep/2015 17:59 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 13/Fév/2004 0:57
Messages: 3702
Tu ne répond pas, quel est le résultat attendu?.

Cela t'arrive t'il de tester tes propres codes?


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Dim 20/Sep/2015 18:05 
Hors ligne

Inscription: Jeu 27/Aoû/2015 14:08
Messages: 54
Nico:

Citation:
2600000.26.0

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


Citation:
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:

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

Citation:
Citation:
2600000.26.0

J'ai corrigé tous ça et j'ai changé des choses car cela ne me convenais pas :)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Dim 20/Sep/2015 18:08 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 13/Fév/2004 0:57
Messages: 3702
Ce code est celui de Micoute?


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Dim 20/Sep/2015 18:14 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 13/Fév/2004 0:57
Messages: 3702
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Dim 20/Sep/2015 18:17 
Hors ligne

Inscription: Jeu 27/Aoû/2015 14:08
Messages: 54
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 ;)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Dim 20/Sep/2015 18:26 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 13/Fév/2004 0:57
Messages: 3702
Dans ce cas, bravo, certainement l'un des meilleurs codes qui soit. :)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Dim 20/Sep/2015 18:29 
Hors ligne

Inscription: Jeu 27/Aoû/2015 14:08
Messages: 54
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 :)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Dim 20/Sep/2015 18:31 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 13/Fév/2004 0:57
Messages: 3702
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.


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 35 messages ]  Aller à la page 1, 2, 3  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  
cron

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye