effacer detruire reinitialiser

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

effacer detruire reinitialiser

Message 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 :-)
Anonyme

Message 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$
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message 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.
Anonyme

Message 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()

@++
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: effacer detruire reinitialiser

Message 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
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message 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
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message 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"
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.
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message 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
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

Result1$= Space(40000)

lolololol
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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.
Répondre