Page 2 sur 2
Publié : mar. 24/janv./2006 17:31
par Dr. Dri
@lionel_om
Le mieux pour copier la chaine c'est encore la méthode de filperj parce que la chaine est dupliquée par PB et les allocations de mémoire sont gérées par PB...
Dri
Publié : mar. 24/janv./2006 19:04
par erix14
filperj a marqué dans son code :
; curieux, je perds mes informations
c'est parce que PureBasic met au début de l'ancienne allocation de mémoire 4 Octets à zéro :
texte.s
texte= "AAAAAAAAAA"
*ptr.BYTE=@texte
Debug "Adresse mémoire où est stocké le texte " + PeekS (*ptr)+ " : " + Hex (@texte)
texte= LSet ( "R" ,60000, "-" )
Debug "Adresse mémoire où est stocké le texte de 60000 caractères : " + Hex (@texte)
For t=1 To 20
Debug Str (t)+ " : " + Str (*ptr\b)+ " -> " + Chr (*ptr\b)
*ptr+1
Next
De plus, c'est risqué de prendre une place mémoire libre, sans que PureBasic soit au courant...

Publié : mar. 24/janv./2006 20:09
par Dr. Dri
Bah en même temps dans son code il n'ajoute pas "nicolas" dans la liste... Si on remplace la ligne ";curieux..." par ajoute(@agenda) le debug fonctionne
Code : Tout sélectionner
Structure entree_agenda
Nom.s
age.l
EndStructure
Procedure CopieEntree(*src.entree_agenda,*dst.entree_agenda)
*dst\Nom=*src\Nom ;<- seul façon stable de copier une chaîne de structure à structure, à ma connaissance
*dst\age=*src\age
EndProcedure
Structure liste
*suivant.liste
;*precedent.liste <- inutilisé pour l'instant
entree.entree_agenda
EndStructure
Global *Pointeur_debut.liste
Global agenda.entree_agenda
Procedure ajoute(*ajouter.entree_agenda)
*nouveau.liste=AllocateMemory(SizeOf(liste))
CopieEntree(*ajouter,@*nouveau\entree)
*nouveau\suivant=*Pointeur_debut
*Pointeur_debut.liste=*nouveau
EndProcedure
agenda\Nom="david"
agenda\age=10
ajoute(@agenda)
Debug *Pointeur_debut\entree\Nom
Debug *Pointeur_debut\entree\age
agenda\Nom="nicolas"
agenda\age=11
ajoute(@agenda)
Debug *Pointeur_debut\entree\Nom
Debug *Pointeur_debut\entree\age
Dri

Publié : mar. 24/janv./2006 20:40
par erix14
Normal, ce sont les quatre premiers octets qui sont mis à zéro. Donc, dans le code de filperj, les quatre premiers octets correspondent à : *suivant.liste
Ensuite viennent : entree.entree_agenda pour le Nom.s et l'age.l

Publié : mar. 24/janv./2006 21:05
par lionel_om
@erix14 : Oui c'est plus imple, mais aussi beaucoup plus contraignant. Là on parle plus de char*, mais de char[TAILLE] (équivalent en C)
@Dr.Dri : Mais j'ai pas les données en doublons. Je me simplifie peut-etre pas la vie, mais je reste générique et ça marche dans tous les cas, comme si c'était PB qui l'avait fait (sauf qu'il faut désallouer tout seul la mémoire)
Publié : mar. 24/janv./2006 21:08
par lionel_om
@erix14 : Oui c'est plus imple, mais aussi beaucoup plus contraignant. Là on parle plus de char*, mais de char[TAILLE] (équivalent en C)
@Dr.Dri : Mais j'ai pas les données en doublons. Je me simplifie peut-etre pas la vie, mais je reste générique et ça marche dans tous les cas, comme si c'était PB qui l'avait fait (sauf qu'il faut désallouer tout seul la mémoire).
Les méthodes évoquées ne sont valables que pour des structures connues, donc impossible de créer des fonctions génériques qui marcheraient pour toutes les structures. Il faut que les paramètres des fonctions soient typés. Moi je n'utilise que des longs banals dans mes fonctions
Publié : mar. 24/janv./2006 23:24
par erix14
En examinant le code de filperj de plus près, je me suis aperçu qu'il faisait en faite un banal Texte1=Texte2 en un peu plus compliquer (avec des pointeurs et des procédures qui se passent les pointeurs)

Donc, aucun problème avec la mémoire.

Publié : mer. 25/janv./2006 10:48
par lionel_om
Code : Tout sélectionner
Structure Bidon
a.l
b.l
s.s
d.w
EndStructure
*a.Bidon = AllocateMemory(SizeOf(Bidon))
*a\a = 10
*a\b = 20
*a\s = "Hello"
l = *a
s = PeekL(l+8)
Debug GlobalSize_(s)
FreeMemory(*a)
Debug GlobalSize_(s)
PB ne semble pas géré aussi bien que ce que vous avez l'air de le dire la mémoire associée aux strings...
Perso je persiste dans mes AllocateMemory(), au moins je sais ce que je fais et je sais que j'aurais pas de la mémoire qui va se ballader....
Publié : mer. 25/janv./2006 11:12
par Dr. Dri
Ca c'est normal, là tu libères une structure, pas la chaine... Essaye de faire *a\s = "" avant le freememory pour voir. PB ne va pas deviner qu'il y a une chaine avec FreeMemory (On retombe sur le probleme de départ et dans ce cas il faudrait un FreeStructure lol)
Dri

Publié : mer. 25/janv./2006 11:32
par lionel_om
Oué je sais mais que PB ne peut pas deviner.
Par contre pour le *a\s = "", ca marche pas non plus : GlobalSize_() renvoi 2. Donc toute la mémoire n'est pas libérée... Faut faire un FreeMemory() supplémentaire. le *a\s = "" ne sert à rien...