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

11

09.03.2009, 22:29

Zitat von »"Databyte"«

Ich denke, dass du beim vector keinen direkten Zugriff auf den eigentlichen Buffer bekommst...
Doch. std::vector garantiert, dass der Speicher intern in einem dynamischen Array verwaltet wird und man mittels &Vector[0] auf den Anfang des Speicherbereichs zugreift.

Trotzdem würde ich eher ein Iterieren und Speichern als Text empfehlen, da man damit viel flexibler ist. Zum Beispiel kann man den Containertypen wechseln und ist nicht an die interne Repräsentation der Typen gebunden.

12

09.03.2009, 22:43

Zitat von »"Nexus"«

Trotzdem würde ich eher ein Iterieren und Speichern als Text empfehlen, da man damit viel flexibler ist. Zum Beispiel kann man den Containertypen wechseln und ist nicht an die interne Repräsentation der Typen gebunden.

Hm, das macht doch überhaupt keinen Unterschied, ob du eine Liste oder einen Vektor speicherst. Du speicherst erst die Anzahl der Elemente und dann jedes Element nacheinander.
Lieber dumm fragen, als dumm bleiben!

13

10.03.2009, 14:52

Zitat von »"Jonathan_Klein"«

Hm, das macht doch überhaupt keinen Unterschied, ob du eine Liste oder einen Vektor speicherst. Du speicherst erst die Anzahl der Elemente und dann jedes Element nacheinander.

ja, eben, wenn am iteriert. Aber nicht, wenn man zum Speichern eines vektors &(vector[0]) benutzt, weil das funktioniert bei ner liste nciht, allein schon, weil se keinen RandomAcess kann.

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

14

10.03.2009, 15:27

Um diese "unschöne" Anweisung "&vec[0]" zu umghen, gab es glaube auch eine Methode namens data...

Wichtiger ist: Die Daten die in dem Vector sind einfach "raw" zu Speichern hat einige Nachteile:
:arrow: Du kannst das ganze nicht oder nur sehr schlecht erweitern.
:arrow: Es ist umständlich, Bugs zu finden
:arrow: Bei virtuellen Klassen und bei Zeigern in den Klassen bekommt man Probleme
:arrow: Es gibt noch mehr Gründe die mir grade nicht einfallen wollen^^

Lösungen fallen mir folgende ein:
:arrow: Datenbanken. Dazu müsstest du aber z.b. mysql lernen, was jedoch nicht besondern schwer ist.
:arrow: XML-Dateien. Mit TinyXML wirklich sehr bequem auszulesen und zu Speichern. Habe ich selbst schon sehr sehr oft eingesetzt.
Eventuell aber noch ein paar Helper-Funktionen schreiben, denen man z.b. einen Parent, einen Elementname und einen int o.ä. übergibt und die daraus folgendes macht:

Quellcode

1
2
3
<Parent>
    <Elemname>Der-int-als-string</Elemname>
</Parent>


Sprich, die entsprechenden Elemente erzeugt und mittels LinkEndChild anfügt aber das findest du schon selber noch raus ;-)

Der Vorteil: Du kannst praktisch jede Art von Daten in einer XML-Datei speichern und auf jeder Platform lesen und du kannst es auch bequem erweitern. Z.B. könnte ein Adressbucheintrag so aussehen:

Quellcode

1
2
3
4
5
<Entry name="Dein Name ;-)">
    <AddrList>
        <Addr>...</Addr>
    </AddrList>
...


Verstehst du was ich meine? Man kann Klassen und ganze Hirarchien super in XML serialisieren. Am besten schaust du dir ein paar Beispiele zu TinyXML an und gibst dann deinen Datenklassen noch Load und Save Methoden. Das ganze lässt sich auch super ausbauen, denn wenn beim Laden z.b. eine Information nicht vorhanden ist, kannst du z.B. eine Warnung ins Logbuch schreiben und einen Std-Wert setzen bzw. einen vom Benutzer abfragen.

Eine weitere alternative wären google protocol buffers, damit habe ich mich aber noch nicht befasst und kann nicht sagen, wie gut das ist.

Socke

15

10.03.2009, 20:35

Zitat von »"Faule Socke"«

Um diese "unschöne" Anweisung "&vec[0]" zu umghen, gab es glaube auch eine Methode namens data...
Im C++-Standard sicher nicht.

Deine Vorschläge (MySQL oder XML) sind sicher bei grösseren Projekten und Datenmengen sehr hilfreich, aber für eine kleine Sammlung von Werten reicht eine einfache Textdatei völlig. Ich glaube auch, Errschaffer ist damit schon genug beschäftigt.

Binäres Schreiben würde ich grundsätzlich vermeiden, wenn man nicht an der binären Repräsentation interessiert ist. Denn ein weiteres Problem, das sich damit stellt, ist die Tatsache, dass es keine Vorschrift für die Interna von Typen gibt. Ein short kann 16, 32 oder 747 Bit haben, in Klassen ist die Memberreihenfolge unterschiedlicher Zugriffsspezifizierer oder bei Vererbung undefiniert, dazu kommen compilerspezifische Optimierungen wie EBO, Little/Big Endian, ...

16

10.03.2009, 22:22

@Faule Socke:
XML mag ich auch, besonders auch, weil, wie Nexus auch erwähnte, Binärdateien einige Probleme mitbringen.
Darum möchte ich hier noch einmal auf ticpp hinweisen, weil es einfach das bessere TinyXML ist. Ich sehe eigentlich keinen Grund mehr, das Original zu benutzen, wo doch die Erweiterung so viele echt nützliche Features bietet.
Lieber dumm fragen, als dumm bleiben!

17

11.03.2009, 15:47

Hm finde in C++ spricht aber auch nichts gegen das normale operator<<-Überladen und std::copy(data.begin(), data.end(), std::ostream_iterator<myclass>(file_stream, "\n")); ... oder?
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

18

11.03.2009, 17:17

Zitat von »"Deviloper"«

Hm finde in C++ spricht aber auch nichts gegen das normale operator<<-Überladen und std::copy(data.begin(), data.end(), std::ostream_iterator<myclass>(file_stream, "\n")); ... oder?

nö, eigentlich nicht. XML ist dann sinnvoll, wenn die Daten mit nem texteditor verendert können werden sollen (richtige reihenfolge der modalverben?).
Nur fürs lesen muss man zwangsläufig die größe des vektors speichern (also davor File << data.size();) und von hand iterieren, oder hab ich was übersehen?

19

11.03.2009, 22:51

Nope brauchst du ja eben in der Form nicht. Und es kommt drauf an wie du operator<< überlädst ob du da nicht auch von Hand editieren kannst. Die Größe bruachst du nicht speichern, da jedes Newline einen neuen Vektor-Eintrag darstellt.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

20

12.03.2009, 15:11

Zitat von »"Deviloper"«

Die Größe bruachst du nicht speichern, da jedes Newline einen neuen Vektor-Eintrag darstellt.

woran erkenn ich aber in der datei, wenn der Vektor zu ende ist? (ok, wenn nur der vektor in die datei kommt, ists EOF, aber ansonsten?)

Werbeanzeige