Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

31

11.12.2006, 14:01

Zitat von »"David_pb"«

@Fred: Da Save() eine Methoden von CPlayer ist, wieso übergibst du dann die Werte als Parameter und speicherst sie nich direkt aus Save()? Du könntest alternativ ein Assoziatives Array verwenden: std::map< int, int > z.B. oder besser boost::property_map. Dann kannst du irgendwelche IDs o.ä. als Parameter übergeben und dir die entsprechenden Eigenschaften aus dem Kontainer ziehen.


Ich übergebe sie deswegen, weil ich, wenn ich z.b. nur eine Information sprichern will, dann kann ich das so machen. Wenn ich statt einem Zeiger auf die Klasse eine Klassenobjekt

C-/C++-Quelltext

1
CPlayer       Player;

deklariere, dann geht es.
Why that?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

32

11.12.2006, 14:10

Versteh dein Problem gerade nicht... Mit einem kleinen Beispiel wär da vllt ausgeholfen.
@D13_Dreinig

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

33

11.12.2006, 14:17

Also wenn ich schreibe:

C-/C++-Quelltext

1
CPlayer* g_pPlayer;


und dann in der Main die Save-Funktion aufrufe:

C-/C++-Quelltext

1
g_pPlayer->save(g_pPlayer->m_iSpeed)


Dann bricht er mir das Programm mit einem senden/nicht senden Dialog ab.

Wenn ich aber schreibe:

C-/C++-Quelltext

1
CPlayer Player;


und in der Main

C-/C++-Quelltext

1
Player.save(Player.Speed);

Dann geht es.

Wenn ich nun später das Spiel ausweite.: Was weiß ich dann kommt vielleicht noch Gweicht usw. dazu und eine Variable verändert sich, so brauch ich nur eine Speichern und nicht alle auf einmal

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

34

11.12.2006, 14:27

Speicher reservieren nicht vergessen:

C-/C++-Quelltext

1
CPlayer* g_pPlayer = new CPlayer;


Und später nicht das freigeben des Speichers vergessen, oder du verwendest einen Smart-Pointer.

Zum Beispiel auto_ptr:

C-/C++-Quelltext

1
2
#include <memory>
std::auto_ptr< CPlayer > g_pPlayer( new CPlayer );


Oder du nutzt die Boost Smart-Pointer:

C-/C++-Quelltext

1
boost::shared_ptr< CPlayer > g_pPlayer( new CPlayer );


Du musst nur darauf achten dass das Verhalten sich unterscheidet. Aber auf jedenfall musst du den Speicher nichtmehr selbst freigeben! ;)

grüße
@D13_Dreinig

35

11.12.2006, 19:42

Zitat

Der sizeof Operator liefert übrigens keine korrekte Angabe über den verbrauchten Speicherplatz von CHero Objekten wenn diese C-Strings halten.


jo sowas dachte ich mir auch schonmal, weil ich hatte es schonmal soweit,dass alles funktioniert, nur die strings wurden ned richtig eingeladen.

muss ich da die strings in char* umwandeln, oder gibts auch ne möglichkeit,dass der die strings abspeichert und richtig ladet?

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

36

11.12.2006, 19:52

Ach sch**** Ich wusste doch, dass...
Man dfas ist ja wirklich ein dummer Fehler, aber danke, dass du ihn mir kundgetan hast

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

37

11.12.2006, 19:57

@Draculark

Insofern du C++ verwendest, nimm einfach die Stings aus der STL

C-/C++-Quelltext

1
2
3
4
5
#include <string>

...
std::basic_string<wchar_t> tmp = L"Hallo Ich bin'n Sting :) ";
...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

38

11.12.2006, 19:57

Zitat von »"Draculark"«

Zitat

Der sizeof Operator liefert übrigens keine korrekte Angabe über den verbrauchten Speicherplatz von CHero Objekten wenn diese C-Strings halten.


jo sowas dachte ich mir auch schonmal, weil ich hatte es schonmal soweit,dass alles funktioniert, nur die strings wurden ned richtig eingeladen.

muss ich da die strings in char* umwandeln, oder gibts auch ne möglichkeit,dass der die strings abspeichert und richtig ladet?


Hab vorhin schon was dazu gepostet. Umwandeln in char* bringt überhaupt nichts.

Zitat von »"koschka"«

@Draculark

Insofern du C++ verwendest, nimm einfach die Stings aus der STL

C-/C++-Quelltext

1
2
3
4
5
#include <string>

...
std::basic_string<wchar_t> tmp = "Hallo Ich bin'n Sting :) ";
...


Das bringt aber auch nichts, da bekommst du auch nicht den tatsächlichen Speicherverbrauch des Strings raus.
Es gibt übrigens eine Typendefinition mit namen std::wstring. ;)

grüße
@D13_Dreinig

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

39

11.12.2006, 20:14

Also wenn ich eine Klasse speichern/laden will mach ich das immer komponentenweise (in neuerer Zeit auch mit ostream-operator). Da hat man nicht so die Probleme wie mit diesen "pauschalspeicherungen". Vor einen String kommt dann eben z.b. noch ein unsigned long, wo die Stringlänge drin ist.

Mal angenommen du würdest einen String gespeichert kriegen. Der liegt dann in der Datei - und? Wie willst du später rauskriegen, wo er aufhört?

40

11.12.2006, 22:07

Zitat

Mal angenommen du würdest einen String gespeichert kriegen. Der liegt dann in der Datei - und? Wie willst du später rauskriegen, wo er aufhört?


man könnte ja annehmen,dass das ding so klug ist,dass es weißt,wenn nach nem buchstaben LANGE nix mehr kommt,dass da das ende ist...

oder,dass es nen string automatisch mit nem zeichen verseht z.b. \send oder sowas und das an jeden string am ende hinzugeadded wird,dass man eben weiß,wo der aufhört:D

aber ist halt ned so^^

Werbeanzeige