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

1

27.06.2010, 22:11

Multimap in Klasse

Hey,
Ich habe mir eine Klasse geschrieben, in der ich eine Multimap verwallte, die als Highscore verwendet wird.
In der Klasse ist die Multimap eine Membervariable und wird über Zugriffsfunktionen gefüllt, gelöscht und in einer Datei gespeichert, bzw von einer Datei geladen.
Allerdingst funktioniert irgend etwas mit der Speicherung nicht richtig. Die Datei erscheint zwar und hat auch etwas drinnen stehen, nur kann ich nichts aus der Datei im Programm wieder implementieren und ausgeben.

Hier mein Code:

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
Highscore.hpp:

#ifndef HIGHSCORE_HPP
#define HIGHSCORE_HPP

#include <iostream>
#include <map>
#include <fstream>

using namespace std;

class CHighscore
{
public:
    void Load(char* cPath);
    void Save(char* cPath);
    void Clear();

    void AddScore(string sName, float fScore);

    bool empty() {return (m_HighscoreMap.empty());};

    multimap<float,string,greater<float>> GetHighscoreMap() { return (m_HighscoreMap); }

private:
    multimap<float,string,greater<float>> m_HighscoreMap; //Die Multimap für den Highscore
};

#endif


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Highscore.cpp:

#include "Highscore.hpp"

//Funktion zum Laden einer Highscore - Multimap aus einer Datei 
void CHighscore::Load(char* cPath)
{
    ifstream Input(cPath,ios::binary);
    if(Input == NULL)
    {
        cout << "Fehler beim öffnen der Datei: " << cPath << endl;
    }
    else
    {
        Input.read((char*)&m_HighscoreMap,sizeof(m_HighscoreMap));
        Input.close();
    }
}

//Funktion zum speichern einer Highscore - Multimap in einer Datei
void CHighscore::Save(char* cPath)
{
    ofstream Output(cPath,ios::binary);
    if(Output == NULL)
    {
        cout << "Fehler beim öffnen der Datei: " << cPath << endl;
    }
    else
    {
        Output.write((char*) &m_HighscoreMap,sizeof(m_HighscoreMap));
        Output.close();
    }
}

//Funktion zum Löschen aller Daten in der Highscor - Map
void CHighscore::Clear()
{
    m_HighscoreMap.clear();
}

//Funktion zum Hinzufügen von neuen Daten in der Highscore - Map
void CHighscore::AddScore(string sName, float fScore)
{
    pair<float,string> pair;
    pair = make_pair(fScore,sName);
    m_HighscoreMap.insert(pair);
}


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
main.cpp:

#include <iostream>
#include <fstream>
#include "Highscore.hpp"

using namespace std;

int main()
{
    CHighscore Highscore;

    Highscore.Load("Data/hsc.hsc");
    Highscore.AddScore("Spielername1",125);
    Highscore.Save("Data/hsc.hsc");

    Highscore.Clear();

    Highscore.Load("Data/hsc.hsc");

    multimap<float,string,greater<float>> Map;
    multimap<float,string,greater<float>>::iterator It;

    Map = Highscore.GetHighscoreMap();

    for(It = Map.begin(); It != Map.end(); It++)
    {
        cout << It->second.c_str() << " : " << It->first << endl;
        cout << "HASIH";
    }
}


Vielen Dank für eure Hilfsbereitschaft :)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

27.06.2010, 22:18

dir ist schon klar, dass du da unter anderem zeiger speicherst, lädst und benutzt?
du musst die map mit nem iterator durchlaufen und die elemente! speichern.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

3

27.06.2010, 23:44

Dass der Iterator ein Zeiger auf die Elemente in der Map sind wusste ich schon. Aber dass die Map an sich auch ein Zeiger ist wusste ich nicht ... Ich dachte mir, dass die Elemente gespeichert werden, indem ich einfach die ganze Map in die Datei schreibe ...

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

4

28.06.2010, 02:25

Die Map ist natürlich kein Zeiger. Aber selbstverständlich wird der Speicher der "Nutzlast", also der Einträge, dynamisch allokiert, was bedeutet, dass der Zustand der Map durch mehr definiert wird als nur den Speicherbereich, den du durch eine Referenzierung der Map-Instanz adressierst.

Was du tun musst, ist jede Adjazenz der Map durchzuiterieren und diese dann zu speichern.
<< an dieser Stelle ist eine Signatur verstorben >>

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »the[V]oid« (28.06.2010, 02:34)


KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

5

28.06.2010, 03:25


Was du tun musst, ist jede Adjazenz der Map durchzuiterieren und diese dann zu speichern.

Wäre es nicht adäquat, den Usus heterogener Termini zu minimieren?
WIP Website: kevinheese.de

Mastermind

unregistriert

6

28.06.2010, 09:42


Was du tun musst, ist jede Adjazenz der Map durchzuiterieren und diese dann zu speichern.

Wäre es nicht adäquat, den Usus heterogener Termini zu minimieren?


Ein doppelplus guter Vorschlag, Genosse Orwell.

7

28.06.2010, 10:23

Ähm ... und was heißt das jetzt?
Sorry, aber bei "allokiert" und "heterogener Termini" usw (Fachchinäsisch in meinen Ohren) versteh ich kein Wort mehr :(

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

8

28.06.2010, 10:40

lol die beiden posts nach thevoid waren scherze^^
allokiert solltest du aber kennen, das ist "Fachchinäsisch" für speicher reservieren.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

9

28.06.2010, 11:07

Dachte ich mir schon ^^

Nur wie kann ich die Elemente richitg speichern und einlesen?
Soll ich den Iterator in einer Vorschleife durch die Liste laufen lassen und danach jeden Iterator in das File schreiben?
Und wie kann ich dann die Elemente wieder in meine Multimap einlesen (aus der Datei natürlich)?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

10

28.06.2010, 13:18

ja du musst das in einer schleife speichern. am besten schreibst du auch in die datei wie groß die map ist. so kannst du beim laden resize an stelle von push_back nutzen was natürlich wesentlich schneller ist.

denk dran dass std::string auch ein container ist.
warum benutzt du nicht den << operator? ich glaub das wäre einfacher

edit: für diese funktion solltest du für den string eine referenz auf const übergeben:

C-/C++-Quelltext

1
void AddScore(string sName, float fScore);

sonst muss er den kompletten string kopieren was sehr lang dauert.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige