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

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

1

28.02.2007, 21:12

floats in Streams speichern und laden

Ich habe ein merkwürdiges Problem mit dem Laden und Speichern von Daten in/aus Streams.

Hier ist der Code, wie ich ein dreidimensionales Array in den Stream schreibe:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
        //Gewichte

        float Weight = 0.0f;
        for (unsigned short i = 0; i < Weights.size(); i++)
            for (unsigned short j = 0; j < Weights[i].size(); j++)
                for (unsigned short k = 0; k < Weights[i][j].size(); k++)
                {
                    Weight = Weights[i][j][k];
                    Stream->write((char*)&Weight, sizeof(float));
                }



Und so wird es geladen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
        //Gewichte

        float Weight = 0.0f;
        for (unsigned short i = 0; i < Weights.size(); i++)
            for (unsigned short j = 0; j < Weights[i].size(); j++)
                for (unsigned short k = 0; k < Weights[i][j].size(); k++)   
                {
                    Stream->read((char*)&Weight, sizeof(float));
                    Weights[i][j][k] = Weight;
                }


Davor und danach werden noch einige andere Daten geschrieben, die aber eigentlich nichts mit dem Problem zu tun haben sollten (alles was davor geschrieben wird wird auch korrekt geladen, und wenn ich die geposteten Zeilen auskommentiere klappt alles). (Weights hat in beiden Fällen exakt die selbe Größe, das habe ich geprüft, und auch die Schleife wird in beiden Fällen gleich oft ausgeführt (logischer weise))

Jetzt das wirklich merkwürdige, ich habe Screenshots im Debugger gemacht:

(Link)



Also mittendrin werden die Daten auf einmal nicht mehr richtig geladen, wie kann das sein?? Vor allem, der Punkt wo die falschen Werte geladen werden verschiebt sich immer. Ich bin ratlos und frustriert :(

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

28.02.2007, 21:17

Generell habe ich so meine Probleme mit mehrdimensionalen Arrays. Hast du denn mal die Größenangaben von size() überprüft oder ist das Array statischer Natur?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

3

28.02.2007, 21:20

Weights ist vom Typ std::vector<std::vector<std::vector<float> > >, die size funktion verwende ich ziemlich oft und es traten bisher keine probleme auf (wäre ja auch ein ding wenn die stl nicht richtig funktioniert)

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

4

28.02.2007, 21:30

Vielleicht ein flush vergessen ?
"Have you tried turning it off and on again?"

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

28.02.2007, 21:31

Prüf doch beim Lesen und Schreiben mal, ob der Stream OK ist oder ob es irgendwelche Fehler gab.

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

6

28.02.2007, 21:32

flush hab ich noch nie gehört, wozu wird das verwendet? Das wird dann wohl der Fehler sein...

edit: prüfe direkt mal ob der stream einen fehler wirft aber ich glaub das hab ich schonmal gemacht und es war alles ok... einen moment

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

7

28.02.2007, 21:36

Die Daten werden erst in einen Buffer geschreiben und nicht direkt in den Stream:
Per flush kannst du deinen Stream dazu zwingen alles zu schreiben. Einfach nach der Schleife einmal aufrufen.
"Have you tried turning it off and on again?"

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

8

28.02.2007, 21:51

Ok habe ein flush eingebaut, aber das ändert nichts. Das failbit wird an der Stelle in der Ladeschleife gesetzt, wo sich ein Wert zum ersten Mal wiederholt (also die erste falsche Zahl geladen wird), die Stelle ändert sich aber jedesmal (eben hat es sogar einmal komplett geklappt.) Beim Speichern wird kein failbit gesetzt.

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

9

28.02.2007, 22:13

Ok also eben hatte ich wieder den fall das es klappt und konnte ein bisschen testen. wenn er die datei einmal korrekt laden konnte, kann er sie immer korrekt laden. das einzige was sich von fall zu fall unterscheidet ist der inhalt von weights, der rest bleibt immer gleich (auch die größe von weights ist beim testen immer identisch), also scheint es was mit den werten zu tun zu haben... exceptions() vom stream liefert übrigens 0 zurück, nachdem das failbit gesetzt wurde.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

10

28.02.2007, 22:15

Versuch es doch mal mit einem 1D Array. Wenn es damit gescheit funktioniert hast du immerhin schonmal nen Ansatz.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige