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

Wirago

Alter Hase

  • »Wirago« ist der Autor dieses Themas

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

1

30.03.2011, 21:04

Speichen und Laden schöner programmieren

ich hab in meinem ersten kleineren projekt (hat "schon" 500 codezeilen ;D ) eine Speichern- und eine Laden-funktion.
Beide funktionen haben auf anieb tadellos funktioniert, nur iwie scheint mir der stil doch ein wenig aufwendig, drum die frage obs vllt iwie einfacher auch geht?
hab zwar schon gegoogelt aber iwie kommen da tausend dinge die alle komplett unterschiedlich aussehen und komplett verwirrend sind.

ich habs so gelöst:

Speichern:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void speichern ()
{
    struct S_Save
    {
        int S_Gold;
        int S_Holz;
        int S_Eisen;
        int S_Bevoelkerung;
        int S_Anzahl_Schwertkaempfer;
        int S_Anzahl_Reiter;
        int S_Anzahl_Bogenschuetze;
        int S_Anzahl_Katapult;
    };

    S_Save Save;
    Save.S_Gold = Gold;
    Save.S_Holz = Rohstoff_Holz;
    Save.S_Eisen = Rohstoff_Eisen;
    Save.S_Bevoelkerung = Bevoelkerung;
    Save.S_Anzahl_Schwertkaempfer = CSoldat::Anzahl_Schwertkaempfer;
    Save.S_Anzahl_Reiter = CSoldat::Anzahl_Reiter;
    Save.S_Anzahl_Bogenschuetze = CSoldat::Anzahl_Bogenschuetze;
    Save.S_Anzahl_Katapult = CSoldat::Anzahl_Katapult;

    ofstream Output ("Save.sav", ios::binary);
    Output.write ((char*) &Save, sizeof (Save));
    Output.close ();

    cout << "Gespeichert." << endl;
};


und Laden:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void laden ()
{
    struct S_Save
    {
        int S_Gold;
        int S_Holz;
        int S_Eisen;
        int S_Bevoelkerung;
        int S_Anzahl_Schwertkaempfer;
        int S_Anzahl_Reiter;
        int S_Anzahl_Bogenschuetze;
        int S_Anzahl_Katapult;
    };

    S_Save Save;

    ifstream Input ("Save.sav", ios::binary);
    Input.read ((char*) &Save, sizeof (Save));
    Input.close ();

    Gold  = Save.S_Gold;
    Rohstoff_Eisen = Save.S_Eisen;
    Rohstoff_Holz = Save.S_Holz;
    Bevoelkerung = Save.S_Bevoelkerung;
    CSoldat::Anzahl_Schwertkaempfer = Save.S_Anzahl_Schwertkaempfer;
    CSoldat::Anzahl_Reiter = Save.S_Anzahl_Reiter;
    CSoldat::Anzahl_Bogenschuetze = Save.S_Anzahl_Bogenschuetze;
    CSoldat::Anzahl_Katapult = Save.S_Anzahl_Katapult;

    cout << "Geladen." << endl;
}


das problem was mir scheint ist jetzt, wenns mal kA 100 variablen sind (mehr einheiten mit jeweils mehr eigenschaften usw) wird diese methode a bissi gar lang.
für vorschläge und tips bin ich ganz ohr :)

Rushh0ur

Frischling

Beiträge: 67

Beruf: Student Elektrotechnik

  • Private Nachricht senden

2

31.03.2011, 00:50

Nun, dein Ansatz ist gut, nur hast du glaub ich denn Sinn von Strukturen noch nicht ganz raus, diese sollten einmallig definiert werden und möglichst oft benutzt werden um auf Daten zuzugreifen.

Zum Beispiel könntest du die struktur global definieren und auf Splitten sowie günstigere namen verteilen, zB in struct Ressourcen, struct Krieger.

Die einzelnen globalen Eigenschaftsvariablen kannst du dann druch eine Struktur deklarieren. Und beim lessen und schreiben musst du halt einfach nur diese benutzen ohne zuerst eine zu erstellen.

Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
struct SRessourcen
{
        int S_Gold;
        int S_Holz;
        int S_Eisen;
        int S_Bevoelkerung;
};

struct SKrieger
{
        int S_Anzahl_Schwertkaempfer;
        int S_Anzahl_Reiter;
        int S_Anzahl_Bogenschuetze;
        int S_Anzahl_Katapult;
};

...

SKrieger Krieger ;
SRessourcen Ressourcen;

...

save()
{
...
    Output.write ((char*) &Ressourcen, sizeof (SRessourcen ));
    Output.write ((char*) &Krieger , sizeof (SKrieger));
}

...


// Nachtrag:
Wenn du mehre ähnliche Objekte hast kannst du die gemeinsamen Eigenschaften zussamenfassen und die Objekte in einem Array oder Vector Speichern und beim lesen bzw schreiben, kannst du ganz einfach durch diesen iterrieren (durchgehn).

Mfg Rushh0ur

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

31.03.2011, 04:31

Ich glaube kaum, dass er die Attribute seiner Klasse CSoldat durch ein Struct ersetzen möchte, nur weil sich das einfacher in Dateien schreiben lässt. Allerdings muss ich auch sagen, dass ich die statischen Variablen von CSoldat auch nicht gerade für eine gute Lösung halte.
Das eigentliche Problem ließe sich mit Reflection sehr schön dynamisch lösen oder eben wie schon bekannt mit manueller Zuweisung der einzelnen Komponenten. Manuell hat zudem den Vorteil, dass die Daten intern weniger statische Struktur aufweisen können wie Schleifen/Arrays/Maps und bedingte Datenfelder.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Wirago

Alter Hase

  • »Wirago« ist der Autor dieses Themas

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

4

31.03.2011, 07:32

Zum Beispiel könntest du die struktur global definieren und auf Splitten sowie günstigere namen verteilen, zB in struct Ressourcen, struct Krieger.
das würde so nicht ganz klappen, weil krieger, reiter etc vererbte klassen der "Basisklasse" CSoldat sind. die Anzahl_xyz sind deshalb als static int deklariert weil sie a) in der basisklasse erstellt werden und b) in allen vererbten klassen und der main() verwendet werden.

Zitat

oder eben wie schon bekannt mit manueller Zuweisung der einzelnen Komponenten
meinst du einfach für jeden variable ne eigene Output.write zeile?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

31.03.2011, 09:26

Jo, meine ich.
Und warum genau hast Du die Attribute als "static int" deklariert? Irgendwie sind beide Punkte keine echte Begründung, sondern weisen auf schlechtes Design hin.
a) static hat mit Basis-Klassen erstmal nichts am Hut und ist auch nicht erforderlich
b) auch das ginge deutlich besser mit nicht-static-Werte. Stichwort Dependency Injection.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Wirago

Alter Hase

  • »Wirago« ist der Autor dieses Themas

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

6

31.03.2011, 09:38

naja... ich hab einige klassenvariablen als static int weil sich auch außerhalb der klassen verwendet werden. :S
"Dependency Injection" hör ich heut zum ersten mal, aber so wie das bei wikipedia steht isses ne tolle sache. muss ich mir mal genauer ansehen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

31.03.2011, 09:45

Aber wenn sie außerhalb verwendet werden, müssen sie lediglich public oder mit set/get versehen sein. Static hat eine ganz andere Bedeutung und ist so gut wie nie notwendig.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Wirago

Alter Hase

  • »Wirago« ist der Autor dieses Themas

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

8

31.03.2011, 10:11

hm... ich bild mir ein, dass der compiler ohne static faxen gemacht hat. kann aber wegen iwas anderem auch gewesen sein.
wenn ich wieder daheim bin schmeis ich das dann raus und versuch die ganze struktur durch manuelle zuweiseung zu ersetzen.

danke für die tips :)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

31.03.2011, 11:04

Das kann schon sein, dass der Faxen gemacht hat, je nachdem, wie Du es programmiert hast. Aber static sollte man wirklich vermeiden. Notfalls schau nochmal in ein Buch, wie Attribute von Klassen funktionieren.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Rushh0ur

Frischling

Beiträge: 67

Beruf: Student Elektrotechnik

  • Private Nachricht senden

10

31.03.2011, 14:58

Noch ein Idee zum speichern von Klassendaten, wenn man schon weiss, dass man Daten von Objekten speichern will, dann kann man für jedes zu speichernde Object eine Objectgebundene abstracte Speicher-Funktion für die einzlenen Objekte definierend und braucht dann zum Speichern nur diese aufzurfen.

Mfg Rushh0ur

Werbeanzeige