copymemory et pointeur

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message 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... :roll:
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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 :?:
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message 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 :D
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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)
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message 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) :mrgreen: Donc, aucun problème avec la mémoire. :D
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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....
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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 ;)
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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...
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Répondre