Page 1 sur 2
MemorySeek ?
Publié : dim. 19/mars/2017 17:30
par Marc56
Hello,
Je commence à m’intéresser à l'accès direct à la mémoire (il serait temps, après 8 ans de PB

)
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

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

Re: MemorySeek ?
Publié : dim. 19/mars/2017 17:44
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
Re: MemorySeek ?
Publié : dim. 19/mars/2017 17:50
par Marc56
\o/ Merci
C'était si simple
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

(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

Re: MemorySeek ?
Publié : dim. 19/mars/2017 17:51
par falsam
Marc56 a écrit :12 c'est parce qu'on est en unicode, donc codé sur 2 octets, je suppose ?
oui
Re: MemorySeek ?
Publié : dim. 19/mars/2017 17:56
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à...
Longueur 5, = "Hello", 5 caractère, on se dis ok logique ici mais...
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:
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.
Re: MemorySeek ?
Publié : dim. 19/mars/2017 17:57
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 ?
Re: MemorySeek ?
Publié : dim. 19/mars/2017 18:00
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
Re: MemorySeek ?
Publié : dim. 19/mars/2017 18:03
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 !
Re: MemorySeek ?
Publié : dim. 19/mars/2017 18:06
par Marc56
@Falsam,
Ne te dérange pas, je suis bête, je peux faire un test moi-même.
La documentation est parfaite (surtout par rapport à d'autres langages), mais il faut prendre le temps de lire et relire.
Re: MemorySeek ?
Publié : dim. 19/mars/2017 18:07
par majikeyric
bonjour le niveau..................................
Re: MemorySeek ?
Publié : dim. 19/mars/2017 18:09
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)
Re: MemorySeek ?
Publié : dim. 19/mars/2017 18:10
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 ")
Re: MemorySeek ?
Publié : dim. 19/mars/2017 18:11
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.

Peut-être que cela devrait être ajouté dans les remarques
https://www.purebasic.com/french/docume ... emory.html
Re: MemorySeek ?
Publié : dim. 19/mars/2017 18:14
par Kwai chang caine
C'est intéressant ce sujet

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
Pour moi, les allocations de mémoire étaient toujours en global

Re: MemorySeek ?
Publié : dim. 19/mars/2017 18:16
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...