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

Re: MemorySeek ?

Message par Marc56 »

@KCC,

J'avais pensé le contraire: à savoir que tout ce qu'on déclare dans la procédure (sauf en Global ou Shared) est libéré dès qu'on sort de la procédure.

Comme quoi, chacun imagine un truc :mrgreen:

bon, 2 truc nouveaux appris aujourd'hui. Super 8)
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: MemorySeek ?

Message par majikeyric »

AllocateMemory() n'alloue pas de variable proprement dite.
C'est ton pointeur qui reçoit l'adresse de la zone mémoire retournée par AllocateMemory() qui est local à la procédure, c'est tout.
J'utilise souvent des procédures qui retournent des pointeurs sur des zones de mémoires allouées dans la proc, c'est très pratique.

exemple une proc qui charge un fichier dans un buffer et retourne un pointeur sur le fichier en mémoire.

Code : Tout sélectionner

Procedure.i LoadBuffer(nomFichier$)
	
	Protected fic.i
	
	If FileSize(nomFichier$)<1 ; Si le fichier n'existe pas ou fait 0 octet
		ProcedureReturn 0
	EndIf
	
	fic=ReadFile(#PB_Any,nomFichier$)
	
	If fic=0
		ProcedureReturn 0
	EndIf
	
	Protected *adresse=AllocateMemory(Lof(fic))
	
	If *adresse=0
		ProcedureReturn 0
	EndIf
	
	If ReadData(fic,*adresse,Lof(fic))=0
		ProcedureReturn 0
	EndIf
	
	CloseFile(fic)
	
	ProcedureReturn *adresse
	
EndProcedure
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 »

Marc56 a écrit :Comme quoi, chacun imagine un truc
Oui c'est sûr...
C'est là qu'on se dit que si on avait pas commencé le film par le milieu, tous ces trucs nous paraitraient tellement évident :oops:
Quant j'étais jeune, et que l'électronique en était à son balbutiement, mon prof d'atelier elec offrait des cours de microprocesseur.
Ca intéressait personne à l'époque, mais moi je m'étais inscrit....même pas peur :mrgreen:
J'en ai fait qu'un seul, jamais j'aurais cru que dans un si petit carré de silicium noir, il se passait autant de choses et en aussi peu de temps 8O
Mon amour de l'électronique a démarré à cette époque, mais j'aurais pas du commencer par Brigitte bardot...Alice sapritch aurait suffit pour mon cerveau d'handicapé... :lol:
Du coups j'ai tellement eu honte de moi, que quand j'ai croisé l'ASM avec PB, j'ai eu comme un arrière goût de "revienzi" et plus jamais je me suis posé ce genre de question que tu te poses :oops:

Image

J'ai tellement peur que la réponse soit encore plus compliqué que la question !!!!
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: MemorySeek ?

Message par case »

Shadow a écrit :
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.
donc puisque c'est libérè en fin de programme on s'en occupe pas avant...
cela reviendrais a dire puisqu'en fin de vie tu n'aura plus l’appendicite on ne s'en occupera pas d'ici la.

bref je te laisse tester l'apendicite...

Code : Tout sélectionner

Procedure apendicite()
  apendice=AllocateMemory(1000000) ;<----- j'ai mis gros car j'ai beaucoup de memoire sur mon pc
  If apendice<>0
    Debug "j'en remet dans mon apendice"
  Else
    Debug "plus de memoire disponible pour le programme : memoire morte de l'apendicite"
    End
  EndIf
 ; FreeMemory(apendice)    ;<------ligne a ajouter pour soigner l'apendicite avant la mort du patient
EndProcedure

Repeat
  apendicite()
ForEver


ImageImage
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: MemorySeek ?

Message par Shadow »

Lol, ouais c'est sur que vue comme ç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.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: MemorySeek ?

Message par Ollivier »

AllocateMemory() alloue et FreeMemory() libère sans distinction de procédure.
vurvur
Messages : 60
Inscription : ven. 29/août/2014 19:52

Re: MemorySeek ?

Message par vurvur »

Est-il possible de chercher une chaîne n'importe où dans la RAM entière du système (y compris les zones non allouées)?
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: MemorySeek ?

Message par Shadow »

Heu, là tu joue avec quelque chose dangereux !
Mais je suppose que oui mais il faut que tu sache quoi lire !

Imagine qu'a la position: 98656654484 tu est un String
déjà comment tu va la savoir hein ?

Si tu sais quoi lire et a quel position, alors je pense que oui
que se soit alloué par PB ou par un autre programme.

Enfin si j'me plante pas, sinon on va me corriger.
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.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: MemorySeek ?

Message par Ollivier »

@ChaudEf

Lire la valeur d'une cellule mémoire RAM à une adresse physique précise, n'importe où dans la mémoire est impossible.

On peut lire des artifacts de données périmées.
On peut aussi freezer l'OS, mais dans ce cas, plus de disque dur, plus d'écran graphique.
Répondre