[PB4] AllocateMemory() en fonction Taille Chaîne$

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

[PB4] AllocateMemory() en fonction Taille Chaîne$

Message par Jacobus »

J'ai fais quelques essais et ça fonctionne.
Allouer une zone mémoire en fonction de la taille de la chaîne$ à y mettre, ni plus ni moins. Evite la perte de mémoire inutile.

Il y a peut-être une optimisation à faire ou à infirmer le processus.
à tester. Vos commentaires ou rectifications sont bienvenues.

Code : Tout sélectionner

;WriteData() et Allocation de zone mémoire en fonction de la taille de la chaîne$
; Mode ASCII ou UTF-8
Chaine$  = "Enregistre ce texte dans le bloc mémoire"
LenghtOf = StringByteLength(Chaine$, #PB_Ascii)
Debug LenghtOf
*MemoryID = AllocateMemory(LenghtOf+1) ;Alloue un bloc mémoire de LenghtOf octets + 1 pour le caractère de fin de chaîne ascii ou utf8
  If *MemoryID
    PokeS(*MemoryID, Chaine$ ,#PB_Default, #PB_Ascii) ; Ecriture d'une chaîne de caractères dans le bloc mémoire
  EndIf
  If CreateFile(0, "Texte.txt"); Création d'un nouveau fichier...
    WriteData(0, *MemoryID, SizeOf(Character)*LenghtOf); On écrit tous les caractères du bloc mémoire dans le fichier
    CloseFile(0); Ferme le fichier précédemment ouvert et enregistre les données  
  Else
    Debug "Impossible de créer le fichier!"
  EndIf
FreeMemory(*MemoryID)



;*******************************************************
;Mode Unicode
Chaine$  = "Enregistre ce texte dans le bloc mémoire"
LenghtOf = StringByteLength(Chaine$, #PB_Unicode)
Debug LenghtOf
*MemoryID = AllocateMemory(LenghtOf+2) ;Alloue un bloc mémoire de LenghtOf octets + 2 pour le caractère de fin de chaîne unicode
  If *MemoryID
    PokeS(*MemoryID, Chaine$ ,#PB_Default, #PB_Unicode) ; Ecriture d'une chaîne de caractères dans le bloc mémoire
  EndIf
  If CreateFile(0, "Texte.txt"); Création d'un nouveau fichier...
    WriteData(0, *MemoryID, SizeOf(Character)*LenghtOf); On écrit tous les caractères du bloc mémoire dans le fichier
    CloseFile(0); Ferme le fichier précédemment ouvert et enregistre les données  
  Else
    Debug "Impossible de créer le fichier!"
  EndIf
FreeMemory(*MemoryID)
Autre possibilité pour déterminer la taille mémoire nécessaire en testant la chaîne$

Code : Tout sélectionner

ch1$ = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; tester une chaîne
ch2$ = "0000000000000000000000000000000011111111111111111111111111111111"; ou une autre
;les résultats correspondent à la taille en octets qu'il faudra allouer à la mémoire via AllocateMemory()
;enfin il faudra ajouter +1 au résultat si #PB_UTF8 ou #PB_Ascii et +2 si #PB_Unicode
  Resultat_utf8 = StringByteLength(ch1$+ch1$+ch1$+ch1$, #PB_UTF8)
  Debug Resultat_utf8 
  Resultat_utf8_1 = StringByteLength(ch1$, #PB_UTF8)
  Debug Resultat_utf8_1
  Resultat_utf8_2 = StringByteLength(ch2$, #PB_UTF8)
  Debug Resultat_utf8_2
  Debug "------------------------------------------------"
  
  Resultat_Ascii = StringByteLength(ch1$+ch1$+ch1$+ch1$, #PB_Ascii)
  Debug Resultat_Ascii
  Resultat_Ascii_1 = StringByteLength(ch1$, #PB_Ascii)
  Debug Resultat_Ascii_1
  Resultat_Ascii_2 = StringByteLength(ch2$, #PB_Ascii)
  Debug Resultat_Ascii_2
  Debug "------------------------------------------------"
  
  Resultat_Unicode = StringByteLength(ch1$+ch1$+ch1$+ch1$, #PB_Unicode)
  Debug Resultat_Unicode
  Resultat_Unicode_1 = StringByteLength(ch1$, #PB_Unicode)
  Debug Resultat_Unicode_1
  Resultat_Unicode_2 = StringByteLength(ch2$, #PB_Unicode)
  Debug Resultat_Unicode_2
Ce test vous donne la taille exacte à reporter dans le code en fonction du mode choisi. Il est aussi très facile de modifier les paramètres (ch1$+ch1$...) en fonction de ce que l'on cherche.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.