lib memory zero/fill/move

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

lib memory zero/fill/move

Message par Dr. Dri »

j'imagine que ce ne sont pas les fonctions les plus difficiles à coder... j'en ai fait deux sur les trois... y'a ke le move que j'ai jamais fait... ce serait bien de les avoir en PB...

Dri
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Le Move ? Pour déplacer un bloc d'une adresse à une autre ?

Pour ça on peut passer par CopyMemory ?
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

je sais pas en fait... j'ai pas fait de tests mais bon ca prend deux minutes... mais si le bloc source et destination se chevauchent, le résultat n'est pas erroné ?

et puis surtout ce qui serait intéressant, c'est de les avoir en PB natif comme ca pas besoin de faire d'userlib ou d'includefile...

Dri
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Il n'y a pas de risque de chevauchement si tu utilises un AllocateMemory. Ce qui permettrait de tout faire en PB natif.

Le seul truc, c'est que la zone de départ ne sera pas forcément désallouée (à moins que tu ne disposes du pointeur de zone source pour faire un FreeMemory()).
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

le problème du chevauchement, c'est qu'on peu très bien vouloir le faire de son plein gré ^^
si je veux bouger une partie d'une zone de mémoire quelques octet "apres" y'a bien un risqaue de chevauchement mais voulu ^^
(c'est pareil avec une copie d'ailleurs, si on veut copier N octets n octets plus loin avec n < N...)

Dri ;)
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Une piste de réponse (mais c'est juste pour un jeu d'essai, pas performant et sans doute pas forcément opérationnel) :

Code : Tout sélectionner

Procedure MoveMemory(*Source_Address, *Destination_Address, Length)
  Debug *Source_Address
  Debug *Destination_Address
  If *Source_Address + Length > *Destination_Address
      *Buffer = AllocateMemory(Length)
      Debug *Buffer
      CopyMemory(*Source_Address, *Buffer, Length)
      FreeMemory(*Source_Address)
      CopyMemory(*Buffer, *Destination_Address, Length)
      FreeMemory(*Buffer)
    Else
      CopyMemory(*Source_Address, *Destination_Address, Length)
      FreeMemory(*Source_Address)
  EndIf
EndProcedure

  Debug "test 1"
  
  String1.s = "String1"
  lString1 = Len(String1)
  
  *Buffer1 = @String1
  *Buffer2 = AllocateMemory(1024)
  
  Debug "Buffer1 : " + PeekS(*Buffer1)
  Debug "Buffer2 : " + PeekS(*Buffer2)
  
  MoveMemory(*Buffer1, *Buffer2, lString1)
  
  Debug "Buffer1 : " + PeekS(*Buffer1)
  Debug "Buffer2 : " + PeekS(*Buffer2)
  
  Debug "test2"
  
  String1.s = "String1"
  lString1 = Len(String1)
  
  *Buffer1 = @String1
  *Buffer2 = *Buffer1 + 1
  
  Debug "Buffer1 : " + PeekS(*Buffer1)
  Debug "Buffer2 : " + PeekS(*Buffer2)
  
  MoveMemory(*Buffer1, *Buffer2, lString1)
  
  Debug "Buffer1 : " + PeekS(*Buffer1)
  Debug "Buffer2 : " + PeekS(*Buffer2)
  
  CallDebugger
End
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

fweil a écrit :c'est juste pour un jeu d'essai, pas performant et sans doute pas forcément opérationnel
je confirme 8O
la fonction ne préserve pas les zones de mémoire désignées et surtout il ne faut pas faire de freememory() à la légère
http://purebasic.hmt-forum.com/viewtopic.php?t=3145

surtout que tu te prends la tête pour pas grand chose ^^
je voudrais juste que ce soit ajouter à PB, bien que ce soit des choses que je pourrais me coder... (même si j'ai pas encore essayer le move)

Dri
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

d'ailleurs en y réfléchissant c koi la différence entre copy et move ?
sur le msdn c'est l'overlap, en francais le chevauchement... c'est donc bien le but de movememory, faire une copie sans exclure la possibilité de chevauchement...

dans ce cas autant que la fonction copymemory de PB le gère directement (ca évite les problème...) et c'est probablement déjà le cas (Fred ?)

du coup ma requête ne porte que sur deux nouvelles fonctions ^^

Dri
Répondre