MemorySeek ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

MemorySeek ?

Message par Marc56 »

Hello,

Je commence à m’intéresser à l'accès direct à la mémoire (il serait temps, après 8 ans de PB :roll: :mrgreen: )

Question, très bête: peut-on faire comme la fonction FileSeek(), mais sur la mémoire ?

Exemple: Un buffer avec "Hello World", comment faire un PeekS() de "World" ? (est-ce possible ?)
(autrement dit décaler de 6 positions)

Code : Tout sélectionner

*MemoireID = AllocateMemory(20)
If *MemoireID
     PokeS(*MemoireID, "Hello World")  
     Debug PeekS(*MemoireID)       ; = "Hello World"            
     Debug PeekS(*MemoireID, 5)    ; = "Hello" 
     Debug ; ???                   ; = "World"
     FreeMemory(*MemoireID) 
Else
     Debug "Impossible d'allouer la mémoire demandée !"
EndIf
J'ai fais des essais toute la journée d'hier, mais pas trouvé, c'est sans doute trop évident :oops: et j'ai fini pas tout emmêler :?
(Je suis en train de faire ça pour lire les tags mp3 v2.3 pour mon desk qui ne lit que les v1 pour l'instant)
Merci
:wink:
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: MemorySeek ?

Message par falsam »

Pas de seek.

Le décalage se fait de cette manière.

*MemoireID + n pour un décalage de n

Code : Tout sélectionner

*MemoireID = AllocateMemory(20)
If *MemoireID
     PokeS(*MemoireID, "Hello World")  
     Debug PeekS(*MemoireID)       ; = "Hello World"            
     Debug PeekS(*MemoireID, 5)    ; = "Hello"
     
     *MemoireID + 12
     Debug PeekS(*MemoireID)   ; = "World"
     *MemoireID - 12
     FreeMemory(*MemoireID) 
Else
     Debug "Impossible d'allouer la mémoire demandée !"
EndIf
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: MemorySeek ?

Message par Marc56 »

\o/ Merci :P

C'était si simple :oops:
12 c'est parce qu'on est en unicode, donc codé sur 2 octets, je suppose ?

J'aurais oublié aussi qu'il faut penser à libérer par rapport à la position initiale :!:

Merci Falsam.
Tu me solutionne en 1 minute 5 heures à me taper la tête sur l'écran :mrgreen:
(J'ai pas osé poser la question avant d'avoir cherché pendant un certain temps)
J'ai appris un truc nouveau, je vais bien dormir ce soir :)
Dernière modification par Marc56 le dim. 19/mars/2017 17:52, modifié 1 fois.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: MemorySeek ?

Message par falsam »

Marc56 a écrit :12 c'est parce qu'on est en unicode, donc codé sur 2 octets, je suppose ?
oui
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: MemorySeek ?

Message par Shadow »

Comme ceci:

Code : Tout sélectionner

*MemoireID = AllocateMemory(20)
If *MemoireID
     PokeS(*MemoireID, "Hello World") 
     Debug PeekS(*MemoireID)       ; = "Hello World"           
     Debug PeekS(*MemoireID, 5)    ; = "Hello"
     Debug PeekS(*MemoireID + 12)   ; = "World"
     FreeMemory(*MemoireID)
Else
     Debug "Impossible d'allouer la mémoire demandée !"
EndIf
Par contre je ne comprends pas trop là...

Code : Tout sélectionner

Debug PeekS(*MemoireID, 5)    ; = "Hello"
Longueur 5, = "Hello", 5 caractère, on se dis ok logique ici mais...

Code : Tout sélectionner

Debug PeekS(*MemoireID + 12)   ; = "World"
Tu dois déplacer ton pointeur de Lecture de tans de caractère pour lire ou tu veux, donc position de *MemoireID + X (X etans le nombre de caractères)
Mais en 5.60, nous somme en unicode, se qui complique la chose, et oui !

Avant ont pouvais choisir Unicode ou pas (Donc 1 octets par caractères en mémoire en non Unicode)
mais là c'est imposé donc en mémoire un caractère prends 2 octets n'est-ce pas ?

Donc ici pas logique:

Code : Tout sélectionner

Debug PeekS(*MemoireID, 5)    ; = "Hello"
Devrais être un truc du genre:
He
Mais là, non, ont a bien:
Hello
La mémoire c'est chose pas simple, j'ai étudier et donc je comprends un peut mieux comment ça fonctionne
sauf que depuis le passage en Unicode, pas étudier car c'est le bazars maintenant avec ça.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: MemorySeek ?

Message par Marc56 »

Merci Falsam :)

Dernière question bête: un buffer (AllocateMemory()) effectué dans une procédure est considéré comme local (protected), donc la mémoire est libérée quand la procédure se termine ou faut il systématiquement passer par FreeMemory ?
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: MemorySeek ?

Message par Marc56 »

@shadow: Regarde la doc de PeekS (comme je l'ai fait)
https://www.purebasic.com/french/docume ... peeks.html
Tout y est expliqué: pourquoi unicode ou ascii et la taille selon le paramètre
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: MemorySeek ?

Message par Shadow »

En faite, je crois que c'est parce que "PeekS()"
lit le nombre de caractère en fonction du Format.

Si Ascii PeekS() prendra 1 octet par caractère.
Si Unicode PeekS() prendra 2 octet par caractère.

Quand tu déplace le pointeur de Lecture, tu dois prendre en compte le Format.

Si Ascii, c'est de 1 en 1.
Si Unicode, c'est de 2 en 2.

Marc, la doc est plutôt bof niveau explication !
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: MemorySeek ?

Message par Marc56 »

@Falsam,
Ne te dérange pas, je suis bête, je peux faire un test moi-même. :wink:

La documentation est parfaite (surtout par rapport à d'autres langages), mais il faut prendre le temps de lire et relire.
Dernière modification par Marc56 le dim. 19/mars/2017 18:07, modifié 1 fois.
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: MemorySeek ?

Message par majikeyric »

bonjour le niveau..................................
Dernière modification par majikeyric le lun. 03/juil./2017 14:55, modifié 1 fois.
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: MemorySeek ?

Message par Shadow »

Oui rien à voir avec la procédure, regarde:

Code : Tout sélectionner

Global *MemoireID

Procedure Abc()
  
  *MemoireID = AllocateMemory(20)
  
  If *MemoireID
    PokeS(*MemoireID, "Hello World")
    
  Else
    Debug "Impossible d'allouer la mémoire demandée !"
  EndIf
  
EndProcedure

Abc()

Debug PeekS(*MemoireID)       ; = "Hello World"           
Debug PeekS(*MemoireID, 5)    ; = "Hello"
Debug PeekS(*MemoireID + 12)  ; = "World"

FreeMemory(*MemoireID)
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: MemorySeek ?

Message par falsam »

majikeyric a écrit :Non la mémoire n'est pas libérée quand la procédure se termine, il faut faire un FreeMemory() quand tu n'en n'as plus besoin.
Et un test en moins ^-^

@Marc : pour connaitre le décalage à effectuer tu peux utiliser la fonction StringByteLength()

Exemple : Debug StringByteLength("Hello ")
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: MemorySeek ?

Message par Marc56 »

majikeyric a écrit :Non la mémoire n'est pas libérée quand la procédure se termine, il faut faire un FreeMemory() quand tu n'en n'as plus besoin.
OK,
Donc on a intérêt à tout de suite écrire un FreeMemory() après un un AllocateMemory() et le "pousser" au fur et à mesure de l'écriture du code (comme on fait pour Procedure/EndProcedure) pour être sur de ne pas oublier de libérer la ram.
Merci majikeyric, bon conseil. :wink:

:idea: Peut-être que cela devrait être ajouté dans les remarques :?:
https://www.purebasic.com/french/docume ... emory.html
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: MemorySeek ?

Message par Kwai chang caine »

C'est intéressant ce sujet 8)
En fait je m'étais jamais posé cette question, mais jamais j'aurais pensé qu'en faisant un alloc dans une procédure, il ne serait disponible que dans la procédure 8O
Pour moi, les allocations de mémoire étaient toujours en global :oops:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: MemorySeek ?

Message par Shadow »

Donc on a intérêt à tout de suite écrire un FreeMemory() après un un AllocateMemory() et le "pousser" au fur et à mesure de l'écriture du code (comme on fait pour Procedure/EndProcedure) pour être sur de ne pas oublier de libérer la ram.
Pas compris mais FreeMemory() est automatiquement appeler à la fin du programme.
Attention en manipulant la mémoire, ça peut être dangereux !
Mais quelqu'un qui sais ou lire dans la mémoire peut faire de très grande chose !
Il peut par exemple tricher dans des jeux, modifier des valeurs des programmes lancé etc...
Dernière modification par Shadow le dim. 19/mars/2017 18:19, modifié 1 fois.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Répondre