[lnkForumImage]
Download FREE Software.

Confronta i prezzi di migliaia di prodotti.
News Forum Italiano
 Home | Login | Registrati | Ricerca 


 

Forums >

it.comp.giochi.sviluppo

Come fare DUMP della memoria?

Equinox

31/03/2009 11:17:37

Buon giorno a tutti,

Una domanda per qualcuno molto esperto:

è possibile fare il DUMP della meoria(credo si dica cosi') salvarla su disco
e poi ricaricarla?

Usando le funzioni del C per gestire la memoria.

Quello che mi piarebbe fare è salvare,durante un gioco che sto cercando di
sviluppare, quello che c'è in memoria, senza andare a scrivere le variabili
locali ,globali e altro dei vari SPRITE.

Grazie per la risposta.

NIccolo'

7 Risposte

GiO

31/03/2009 16:02:42

0

Salve equinox,
Il 31/03/2009 13.17 ha scritto:

> Una domanda per qualcuno molto esperto:
> è possibile fare il DUMP della meoria(credo si dica cosi') salvarla su disco
> e poi ricaricarla?
> Usando le funzioni del C per gestire la memoria.
> Quello che mi piarebbe fare è salvare,durante un gioco che sto cercando di
> sviluppare, quello che c'è in memoria, senza andare a scrivere le variabili
> locali ,globali e altro dei vari SPRITE.
> Grazie per la risposta.

Normalmente, non hai nessuna sicurezza che la memoria che allochi sia
contigua, quindi fare un dump non è banale.

Se lo scopo è fare un (rozzo) sistema di salvataggio/caricamento, puoi
procedere così:
- ti fai un tuo allocatore, così sei sicuro che tutto ciò che crei sia
allocato nella zona che controlli tu: l'allocatore, a inizio partita, si
accaparra una certa quantità di memoria contigua (es. il massimo che può
servire)
- allochi la memoria per ogni oggetto tramite il tuo allocatore (invece
che usando malloc)
- salvi tutto con un write
- carichi tutto con un read

Ovviamente sei limitato a dover usare solo variabili create a runtime,
cosa che non dovrebbe causarti troppi problemi.
Ovviamente, se scrivi l'allocatore, devi scrivere anche il deallocatore.

Spesso cmq quando iniziano questo tipo di esigenze è arrivato il momento
di studiare un po' di C++.

--

C++U,

GiO

Equinox

31/03/2009 17:51:54

0

> Se lo scopo è fare un (rozzo) sistema di salvataggio/caricamento, puoi
> procedere così:

Si, questa è l'intenzione

> - ti fai un tuo allocatore, così sei sicuro che tutto ciò che crei sia
> allocato nella zona che controlli tu: l'allocatore, a inizio partita, si
> accaparra una certa quantità di memoria contigua (es. il massimo che può
> servire)
............

Ehm...non è che hai del codice sorgente che potrei adattare? Il c che uso è
standard.
Grazie in ogni caso.


Enrico Colombini

31/03/2009 19:36:00

0

equinox wrote:
> Ehm...non è che hai del codice sorgente che potrei adattare? Il c che uso è
> standard.

In alternativa, potresti tenere tutti i tuoi dati in una singola
struttura dati globale (che ovviamente puo' a sua volta contenere
strutture, array di strutture, ecc.). Quando vuoi salvare fai una fwrite
della struttura con una lunghezza pari al suo sizeof, e reciprocamente
la ricarichi con fread sopra a quella esistente.

Inconvenienti:
- Non puoi avere puntatori che puntino a elementi contenuti nella
struttura dati, o comunque li devi ricostruire al load perche' nessuno
garantisce che la volta successiva la struttura si trovi allo stesso
indirizzo.
- Non puoi calcolare dinamicamente la dimensione dei dati che ti
servono, ma devi deciderla all'inizio una volta per tutte.

Per un gioco semplice puo' anche funzionare, ma in pratica e' molto piu'
comodo e versatile salvare sepratamente le varie strutture separate (es.
i dati delle tue sprite), ad esempio una dietro l'altra nello stesso
file. Se non sai a priori quante sono, salvi per prima cosa il loro
numero, in modo che lo userai al load per sapere quante rileggerne dal
file (allocando prima la memoria necessaria).

Quanto a salvare le variabili locali e lo stack, la risposta semplice
e': scordatelo. Potresti forse fare qualcosa del genere se conoscessi a
menadito le interiora del compilatore che usi, ma in tal caso non
avresti probabilmente fatto questa domanda :-)

.Erix.

Davide Pasca

01/04/2009 14:11:04

0

On Mar 31, 8:17 pm, "equinox" <equin...@alice.it> wrote:
> Buon giorno a tutti,
>
> Una domanda per qualcuno molto esperto:
>
> è possibile fare il DUMP della meoria(credo si dica cosi') salvarla su disco
> e poi ricaricarla?

...e' un problema annoso che non si risolve in C/C++, ma neanche
facilmente con altri linguaggi, perche' diventa anche una questione di
sistema operativo.. che si cura di gestire la memoria dinamica.
Per per semi-automatizzare la persistenza dei dati, devi quantomeno
gestire in maniera special i puntatori alla memoria che hai nei dati.
Il termine specifico che puoi usare per cercare su Internet e'
"serialization". Una FAQ popolare e' la seguente:

http://www.parashift.com/c++-faq-lite/serializ...

baubau
Davide

GiO

02/04/2009 14:49:34

0

Salve equinox,
Il 31/03/2009 19.51 ha scritto:

> Ehm...non è che hai del codice sorgente che potrei adattare? Il c che uso è
> standard.

Non uso C standard da molto tempo, cmq se googli un po' "custom
allocator in C" o roba del genere, troverai sicuramente tantissimo
materiale.

Come già ti è stato scritto, questa soluzione è una "pezza", l'approccio
corretto è serializzare i dati e, in particolare, se stai scrivendo un
gioco, serializzare solo quella parte dei dati che è per te importante
ai fini del gioco, resettando gli altri dati al caricamento. Salvare
tutto è generalmente molto antieconomico.


--

C++U,

GiO

Gabriele Greco

02/04/2009 15:53:31

0

equinox wrote:

> Ehm...non è che hai del codice sorgente che potrei adattare? Il c che uso è
> standard.

Se passi a lavorare in C++ ti posso consigliare una libreria che con
interventi minimi al codice permette di serializzare classi complesse,
puntatori, container di classi, array... aggiungendo un semplice metodo
ed una derivazione ad ognuna delle classi che devono essere serializzabili.

La libreria e` boost::serialize, al seguente link trovi i sorgenti (con
licenza bsd, si possono usare in pratica senza limitazioni in qualunque
tipo di progetto), la documentazione e un tutorial:

http://www.boost.org/doc/libs/1_38_0/libs/serialization/doc/...

Equinox

04/04/2009 16:39:54

0

> Se passi a lavorare in C++ ti posso consigliare una libreria che con
> interventi minimi al codice permette di serializzare classi complesse,
> puntatori, container di classi, array... aggiungendo un semplice metodo ed
> una derivazione ad ognuna delle classi che devono essere serializzabili.

Intanto ringrazio voi tutti per le risposte e consigli.

Uso solo C ansi, perchè il compilatore che usaop per fare il giochino,oltre
che al suo linguaggio e funzioni, si basa sul C standard. Quindi, non poss
usarne altri tipi e non credo di poter utilizzare la lib che mi indichi
Gabriele.

Ora vado a veder sul link.

Grazie.

NIccolo'