Page 1 sur 1

effacer detruire reinitialiser

Publié : mar. 05/déc./2006 16:55
par tonton
je sais que c'est violent mais j'arrive pas a effacer detruire reinitialiser
une varibale / chaine de caractères du type chaine$

mon probleme est que quand je la réappelle pour y mettre un texte plus petit, elle garde une partie de son ancien texte

merci :-)

Publié : mar. 05/déc./2006 17:29
par Anonyme
Ceci marche très bien :D

Code : Tout sélectionner

T$= "Tonton qu'est ce qui t'arrive?"
Debug T$
T$ = "Ch'ai pô..."
Debug T$

Publié : mar. 05/déc./2006 18:04
par tonton
yo bator!

en fait je fait cohabiter les gadgets et l assembleur.
en basic le blem est transparant et ne se pose pas...

la zone memoire contenant le text , n est pas remis a zero
par exemple si on fait une lecture direct de la memoire avec ton exemple apres le second texte, on a cela:

"Ch'ai pô... ce qui t'arrive?"

y a le bout du premier et le bout du second.

j aimerai vider totalement la zone memoire avec une fonction en basic .
j ai pensé avec la fonction "alocatememory ", mais je ne sais pas la mettre en oeuvre avec une chaine de caracteres.

Publié : mar. 05/déc./2006 18:18
par Anonyme
Les commandes que tu utilises pour la mémoire, c'est de l'asm ?

sinon en basic :

Code : Tout sélectionner

*T = AllocateMemory(4*6)
PokeS(*T,"COUCOU")
Debug PeekS(*T,6)
FreeMemory(*T)
Debug PeekS(*T,6)
*T = AllocateMemory(4*13)
PokeS(*T,"TONTON TONTON")
Debug PeekS(*T,13)
Ca marche très bien, en fait je n'arrive pas à reproduire ton problème.
FreeMemory() efface une zone mémoire alloué avec AllocateMemory()

@++

Re: effacer detruire reinitialiser

Publié : mar. 05/déc./2006 19:09
par Anonyme2
tonton a écrit :je sais que c'est violent mais j'arrive pas a effacer detruire reinitialiser
une varibale / chaine de caractères du type chaine$

mon probleme est que quand je la réappelle pour y mettre un texte plus petit, elle garde une partie de son ancien texte

merci :-)
Il me semble que PB utilise les fonctions Heap pour l'allocation mémoire

Mais je me demande comment PB va supporter le fait que la taille ait changé car son ramasse miette libère les ressources à la fin est s'il tente de désallouer une taille incorrecte, je ne sait pas ce qu'il va se passer

La syntaxe asm de déclaration est la suivante pour les API, celle d'allocation, celle de libération et celle de réallocation etc

Code : Tout sélectionner

Extrn _HeapAlloc@12
Extrn _HeapCreate@12
Extrn _HeapDestroy@4
Extrn _HeapFree@12
Extrn _HeapReAlloc@16
Essayes de déclarer l'API que tu vas utiliser avec un point d'exclamation devant

Code : Tout sélectionner

!Extrn _HeapReAlloc@16
mais tu auras peut-être une erreur de compilation car elle sera peut-être déjà déclarée, dans ce cas tu supprimes la déclaration


Tu te reportes à la doc MS ici
http://msdn.microsoft.com/library/defau ... ctions.asp

pour récupérer le hHeap, je n'ai pas trouvé dans le fichier sdk mais tu crée un asm depuis un fichier PB qui utilise une chaine et dans le listing tu dois trouver une variable contenant dans son nom le mot heap ou memory (reportes-toi à l'appel des fonction de chaîne dans le listing)

HeapReAlloc utilise 4 paramètres , le hHeap , les options de réallocation, le pointeur actuel sur la mémoire de la chaine lpMem et le dernier paramètre la taille en octets recherchée.

Pour appeler l'API, tu empiles les paramètres en commençant par le dernier pour finir par le heap. les 4 paramètres sont des mot de 32 bits

Code : Tout sélectionner

PUSH  dwBytes
PUSH  lpMem
PUSH  dwFlags
PUSH  hHeap
CALL  _HeapReAlloc@16
La pile est ajsutée par l'API, pas besoin de bricoler esp

D'après la doc, tous les paramètres sont des paramètres d'entrée, j'en déduis que eax contiendra le pointeur sur la nouvelle zone mémoire allouée

Il faudrait pouvoir modifier le pointeur de PB qui stocke l'ancienne adresse

Je pense qu'il serait bien que tu désalloues la mémoire toi-même car PB ne le fera pas du fait du changement de pointeur

Publié : mar. 05/déc./2006 20:42
par tonton
@bator, ton exemple fonctionne, mais ne permet pas d allouer ou de mesurer une chaine de caracteres directement dans la memoire.

merci denis, tu es callé, mais je pressent le pantage, lol. :lol:

j ai trouvé une methode a la "Mc Gyver" , j alloue la zone memoire avec des "espace" (tres beaucoup d "espace"), et pout trouver la fin de la chaine , faut chercher le "0".

bon, je me comprent!!! c est mon style tordu :D

merci a vous

Publié : mer. 06/déc./2006 13:12
par Jacobus
Et comme ça ?

Code : Tout sélectionner

chaine1$ = "chaine num 1"
  chaine2$ = "chaine suivante"
  
  ;On récupère la taille exacte nécessaire à la chaîne...
  LenghtOf=StringByteLength(chaine1$, #PB_Ascii)
  *MemoryID = AllocateMemory(LenghtOf+1) ; Alloue un bloc mémoire de LenghtOf octets + 1 pour le caractère de fin de chaîne
  If *MemoryID
    PokeS(*MemoryID, chaine1$,#PB_Default, #PB_Ascii ) ; Ecriture d'une chaîne de caractères dans le bloc mémoire
   EndIf 
   If CreateFile(0, "D:\Documents and Settings\Jacobus\Mes documents\TexteTest.txt")   ; Création du fichier
    WriteData(0, *MemoryID, SizeOf(Character)*LenghtOf); On écrit les caractères du bloc mémoire dans le fichier
    CloseFile(0)
   EndIf 
  FreeMemory(*MemoryID)
  Debug "Ok chaine 1"
  ;On recommence pour la chaîne suivante
  LenghtOf=StringByteLength(chaine2$, #PB_Ascii)
  *MemoryID = AllocateMemory(LenghtOf+1) 
  If *MemoryID
    PokeS(*MemoryID, chaine2$,#PB_Default, #PB_Ascii )
   EndIf 
   If CreateFile(1, "D:\Documents and Settings\Jacobus\Mes documents\TexteTest.txt")
    WriteData(1, *MemoryID, SizeOf(Character)*LenghtOf)
    CloseFile(1)
   EndIf 
  FreeMemory(*MemoryID)
  Debug "Ok chaine 2"

Publié : mer. 06/déc./2006 16:46
par tonton
heuu... 8)

en fait, pour simplifier,
lorsqu on ecrit un text dans une fenetre "GetGadgetText" le texte est placé dans un "bidule$", et la memoire alloué et celle de la taille du texte.

et mon souhait, est de choisir moi meme cette memoire alloué, quelque soit la longueur du texte.

faudrait une instruction du style "Alocatememory(bidule$,10000) :D

Publié : mer. 06/déc./2006 17:28
par Anonyme2
Je ne sais pas comment tu structures ton programme mais dans mes librairies en asm, j'utilise souvent la pile pour stoker mes chaines de caractères.

Tu peux aussi créer directement une zone sur la pile avec des instructions du type

Code : Tout sélectionner

Structure MilleVingtQuatre_Octets
      ANDmask.b[1024]
EndStructure
et ensuite dans tes procedures, tu déclares une variable locale, à la sortie de la procédure les infos de la pile sont "perdues"

Code : Tout sélectionner

      Protected ANDmask.MilleVingtQuatre_Octets
tu récupères l'adresse de la variable, dans ce cas la taille est fixe mais dans bien des cas c'est largement suffisant

La pile n'est pas élastique (1 Mo il me semble pour le programme)

La variable peux aussi être globale et donc disponible partout.

Tu peux aussi définir des datas qui seront également accessibles en écriture, tu peux stocker dans le déroulement du programme ce que tu veux

Publié : dim. 17/déc./2006 20:32
par tonton
Result1$= Space(40000)

lolololol

Publié : lun. 18/déc./2006 14:21
par Anonyme2
tonton a écrit :Result1$= Space(40000)

lolololol
Dans le cas ou la variable est protected, un long est réservé sur la pile, les 40000 espaces sont alloués avec les fonctions d'allocation de mémoire.

Le long recevra l'adresse de la zone mémoire allouée pour la chaine. En fin de procedure, PB désalloue automatiquement les 40000 espaces alloués.