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

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

1

14.09.2011, 08:23

include: fstream (Array Daten speichern)

Hey,
ich Arbeite gerade an einem TileMap Editor und habe ein kleines Problem beim Speichern der TileMap daten.
Ich habe jedem Tile den Wert: 0 gegeben und will nun die Daten in einer Map.txt Speichern, doch leider spuckt mein Compiller folgende Fehlermeldung aus.

Fehlermeldung:

(Link)


Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Map_Speichern
// Aufgabe: Speichert die Map Datein.
void Map_Speichern (int Map[])
{
    // Outputstream erstellen
    ofstream Output ("Map.txt", ios::binary);

    // Daten in Output schreiben
    for (int y=0; y<16; y++)
    {
        for (int x=0; x<16; x++)
        {
            Output.write ((char*) Map[x+y*16], sizeof (Map[x+y*16]));
        }
    }

    // Outputstream schließen
    Output.close ();
}


MFG:
Raidenkk/Kevin

DarioFrodo

Treue Seele

Beiträge: 349

Wohnort: Kerkau, 100km nördlich von Magdeburg

Beruf: Selbstständig

  • Private Nachricht senden

2

14.09.2011, 08:35

Hast du schonmal auf "Retry" geklickt?
Denn dann springt Visual Studio direkt in den Code an der Stelle wo der Fehler sein könnte.

Tritt der Fehler am Anfang der Schleife auf, oder mittendrin? Bei welchen x und y Werten?
Wie sieht die Variable aus, die du der Funktion als Parameter übergibst? Ist sie groß genug?
Erst wenn der letzte Fluss vergiftet,
der letzte Baum gefällt,
der letzte Fisch gefangen,
dann werdet ihr merken, dass man Geld nicht essen kann

Man verkauft die Erde nicht, auf der die Menschen wandeln.

- Indianerweisheiten

Ich bin auch ein einhornimmond ;)

DarioFrodo

Treue Seele

Beiträge: 349

Wohnort: Kerkau, 100km nördlich von Magdeburg

Beruf: Selbstständig

  • Private Nachricht senden

3

14.09.2011, 08:40

Schau dir mal den 2. Parameter, den du der write funktion übergibst, an.
Was genau macht dieser? Was genau erwartet dir write Funktion an dieser Stelle?
Erst wenn der letzte Fluss vergiftet,
der letzte Baum gefällt,
der letzte Fisch gefangen,
dann werdet ihr merken, dass man Geld nicht essen kann

Man verkauft die Erde nicht, auf der die Menschen wandeln.

- Indianerweisheiten

Ich bin auch ein einhornimmond ;)

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

4

14.09.2011, 09:05

Meine Array hat 256 Speicherblöcke.

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <SFML/Graphics.hpp>
#include <iostream>
#include <fstream>

using namespace std;

// Prototypen
void Map_Initialisieren (int Map[]);
void Map_Speichern (int Map[]);

int main ()
{
    // Variablen
    int Map[256];

    // Create Game Window
    sf::RenderWindow App(sf::VideoMode (800, 600, 32) ,"Push Blocks MapEditor v0.1a - Revision: 1");

    Map_Initialisieren (Map);
    Map_Speichern (Map);

    // Game Loop
    while (App.IsOpened ())
    {
        sf::Event Event;
        while (App.GetEvent (Event))
        {
            if (Event.Type == sf::Event::Closed)
            {
                // Window Close
                App.Close ();
            }
        }

        App.Clear ();
        App.Display ();
    }

    return 0;
}

// Map_Initialisieren
// Aufgabe: Erstellt die Map daten.
void Map_Initialisieren (int Map[])
{
    for (int y=0; y<16; y++)
    {
        for (int x=0; x<16; x++)
        {
            Map[x+y*16] = 0;
        }
    }
}

// Map_Speichern
// Aufgabe: Speichert die Map Datein.
void Map_Speichern (int Map[])
{
    // Outputstream erstellen
    ofstream Output ("Map.txt", ios::binary);

    // Daten in Output schreiben
    for (int y=0; y<16; y++)
    {
        for (int x=0; x<16; x++)
        {
            Output.write ((char*) Map[x+y*16], sizeof (Map[x+y*16]));
        }
    }

    // Outputstream schließen
    Output.close ();
}

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

14.09.2011, 09:15

Der Thread hat absolut nichts mit 3D-Grafik zu tun. Ich verschiebe ihn ...

DarioFrodo

Treue Seele

Beiträge: 349

Wohnort: Kerkau, 100km nördlich von Magdeburg

Beruf: Selbstständig

  • Private Nachricht senden

6

14.09.2011, 09:40

Was soll die Funktion Output.write machen, was erwartest du von ihr?
Soll sie das ganze Array in eine Datei schreiben?

Das wäre dazu der einfachste Weg...

C-/C++-Quelltext

1
Output.write (Map, sizeof(int) *256);


Du übergibst als ersten Parameter Map.. der in diesem Kontext ein Pointer ist.
Ein Pointer auf das Array mit den 256 int
Als zweites übergibst du die Größe des Speicherbereiches, den du in deine Datei schrieben möchtest.
In diesem Fall die Größe von int * 256.

In deinem Code bist du in einer Schleife durch jeden Wert einzeln gegangen und wolltest jedes einzelne int in die Datei schreiben,
wobei du als Größe etwas übergibst wovon ich keinen Schimmer habe wie das ausgewertet wird.
Lass dir dochmal das Ergebnis von

C-/C++-Quelltext

1
sizeof(Map[x+y*16])
ausgeben (z.B. auf der Konsole) um
zu verstehen was da überhaupt passiert.
Dazu kommt.. Output.write erwartet einen Zeiger auf den Speicherbereich wo er die Daten findet.
Map[x+y*16] ist jedoch kein Zeiger. Und wenn du in nach char* castest, bedeutet dies, das du den Wert der sich in deiner Map
befindet als Zeiger auf einen Speicherbereich ausgewertet wird. In deinem Beispiel also versucht das Programm auf die Speicheradresse 0 zuzugreifen.
Da sich in deiner Map nach der Initalisierung lauter nullen befinden.

Initalisieren würde auch einfacher gehen, z.B. mit memset

C-/C++-Quelltext

1
memset(Map, 0, sizeof(int)*256);
Erst wenn der letzte Fluss vergiftet,
der letzte Baum gefällt,
der letzte Fisch gefangen,
dann werdet ihr merken, dass man Geld nicht essen kann

Man verkauft die Erde nicht, auf der die Menschen wandeln.

- Indianerweisheiten

Ich bin auch ein einhornimmond ;)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

14.09.2011, 09:51

(char*) Map[x+y*16]

So geht das nicht.
Um die Adresse eines Objekts zu bekommen, benutzt man den &-Operator.
Also &(Map[x+y*16]) (Klammer unnötig, macht aber deutlich, wie es gemeint ist)!

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

8

14.09.2011, 09:57

EDIT:
Ah du warst schneller ^^
Danke dir jetzt geht es und daraus gelernt habe ich auch :)

Werbeanzeige