Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Zeiger Zuordnung in Datei speichern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
29.09.2008, 22:24 Uhr
~Rolf
Gast


Hallo,

ich möchte den Programmzustand in einer Datei speichern um diesen später, also nach z.B. Neustart wieder herzustellen. Dies mache ich über Zeiger auf die jeweiligen Variablen.
Solange es sich um Variablen handelt, ist dies auch kein Problem. Jedoch ist es notwendig auch die Zuordnungen von einigen Zeigern später wiederherzustellen. Der Zeiger enthält ja als Wert die Adresse, der Variablen auf die gezeigt wird. Mit diesem Adress Wert kann ich jedoch nur was während der aktuellen Programmausführung anfangen. Wenn ich das Programm neu starte, können die Variablen auf ganz anderen Adressen angelegt sein. Würde ich dann den Adresswert aus der Datei in den Zeiger laden, gibt es Chaos.

Nun stell ich mir die Frage, wie ich so ein Zuordnung über die Programmausführung hinaus sichern kann?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.09.2008, 03:26 Uhr
0xdeadbeef
Gott
(Operator)


Uh...indem du die Werte der Variablen speicherst, nicht ihre Speicheradressen? Jedenfalls werden, was die Speicheradressen angeht, beim Neustart des Programms die Karten neu gemischt - mit den Adressen eines vorherigen Prozesses kannst du da rein gar nichts anfangen.

Etwas derartiges kann ich mir eigentlich nur dann sinnvoll vorstellen, wenn du die relevante Speicherverwaltung von Hand machst, so a la TeX - das heißt, einen großen Speicherbereich anlegen und dann per placement new alles da reinpacken. Allerdings wirst du auch damit nicht den gesamten Programmzustand erschlagen, und die Zeiger wären ggf. immer noch relativ zur Position des Arrays, die müsstest du also vorher runterrechnen. Außerdem bringt ein solcher Ansatz seine ganz eigenen Probleme mit sich - du musst im Grunde deine eigene Heap-Verwaltung schreiben, darauf achten, dass keine Verweise aus dem Array hinausgehen (d.h., keine Stackvariablen, äußerst unangenehm), und dein Programm wäre speichermäßig auf die Größe des Arrays beschränkt.

Wie dem auch sei, das ist eigentlich nur sehr selten ein praktikabler Ansatz (für Emulatoren ist so etwas brauchbar, denn da musst du es eh machen), aller Wahrscheinlichkeit nach macht es für dich mehr Sinn, dir zu überlegen, was eigentlich einen Programmzustand darstellt, den zu speichern, und die Struktur aus den gespeicherten Werten beim Laden wieder aufzubauen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.09.2008, 09:18 Uhr
~Rolf
Gast


Ja habe savestates für meinen Emulator implementiert. Ich bekomme ab und an totale Abstürze des Emus, gerade wenn ich savestates neu lade nachdem der Emu neugestartet wurde. Es liegt wohl daran, dass ich versucht habe Zeigeradressen zu speichern. Aber wie du schon sagst die Karten werden dann neu gemischt und der Zeiger zeigt nicht mehr auf die richtige Adresse.
Eine aufwendige Möglichkeit wäre in einer extra Variablen für jeden Zeiger zu speichern, auf welche Variable der Zeiger gerade zeigt und dann beim Laden mit einem switch/case den Zeiger neu setzen.
Dass muss doch auch schöner gehen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.09.2008, 11:57 Uhr
0xdeadbeef
Gott
(Operator)


Unter der Annahme, dass du die Speicherverwaltung eh auf wie oben beschriebene Weise selbst machst, das Problem wird sein, dass das Array bei jedem Programmstart wieder irgendwo anders liegen kann.

Im Grunde läuft die Lösung darauf hinaus, den Status der emulierten Maschine in sich abgeschlossen zu halten, so dass du das Array (das den Speicher der emulierten Maschine bedeutet) irgendwohin dumpen und später wieder einlesen kannst. Dafür muss der Emulator einen virtuellen Adressraum zur Verfügung stellen, das bedeutet, alle emulierten Speicheradressen müssen relativ zum Array sein. Eine emulierte Speicheradresse 123 zeigt dann auf die reelle (quasi-reelle, aber lass uns uns nicht mit Details aufhalten) Adresse array + 123, und der Emulator wurschtelt das halt in den Speicherzugriffsoperationen um.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.09.2008, 14:53 Uhr
~Rolf
Gast


Speicherbereiche (z.B. den Arbeitsspeicher des emulierten Systems) stellen auch kein Problem dar. Es gibt grundsätzlich 3 Arten von Informationen die ich in einer savestate Datei unterbringen muss:

1.Werte von Variablen
2.komplette Heap Speicherbereiche
3.Pointer

Nur die 3. Kategorie ist problematisch, da die Variablen auf die der Pointer zeigt an verschieden Stellen im Arbeitsspeicher generiert werden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.09.2008, 18:55 Uhr
0xdeadbeef
Gott
(Operator)


Nene, die Idee war schon, den gesamten Speicher der emulierten Maschine in einem Array zu halten. Auf die Art muss der save state dann nur den Speicher der emulierten Maschine enthalten, i.e., ein Dump des Speicherarrays sein.

So wie du das anfängst, wird das kompliziert. Wenn du die Zeiger den Heap-Bereichen zuordnen kannst, lässt sich da möglicherweise noch was drehen - die Zeiger halt in einen Handle für den Heap-Bereich und einen offset umrechnen - aber dreckig wird das, darauf kannst du dich verlassen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
30.09.2008, 21:26 Uhr
~Rolf
Gast


Neben dem Speicher der emulierten Maschine müssen die Werte so ziemlich aller globalen Variablen abgespeichert werden. Ich habe es jetzt so gelöst, dass für jede Variable auf die der Pointer zeigen kann ein Integer repräsentativ gesetzt ist. Dieser Integer wird auf gewohntem Weg in die savestate Datei geschrieben. Beim Wiederherstellen wird anhand dieses Wertes der Zeiger neu gesetzt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: