Page 1 sur 1

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

Publié : ven. 30/juin/2006 17:03
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.