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

17.05.2006, 13:25

Input Output <fstream> Frage

Hallo,

also ich hab jetzt heut mal wieder bischen herumexperimentiert mit den fstreams und bin dann auf ein für mich merkwürdiges und unerklärliches ergebnis gekommen :)

also 1)
es handelt sich um ne konsolenanwendung.

dort ist in form von text eben ein kleines abenteuer geschrieben mit kämpfen , zaubern, beutelgegenstaenden etc.
das klappt auch alles perfekt nur wollte ich jetzt ein savesystem machen.

dazu hab ich mir folgendes überlegt.

für jeden quest gibts ne bool variable z.b.:

bool b_TutorialCompleted.

diese variablen sind in der "hauptheld" klasse drin.

wenn jetzt der held die tutorial mission erledigt hat, wird die variable auf true gesetzt und der spieler wird gefragt ob er speichern will.

so nun zum wichtigen:

speichern scheint zu funktionieren und das laden scheint dann auch wieder zu funktionieren, da die erfahrung, das level etc. alles stimmt ABER sobald dann eine funktion, die vor der "laden funktion" geschrieben wurde, kommen 1-2 fehler und das programm schließ sich :(

leider weiß ich eben nicht warum und hab jetzt bischen herumprobiert und krigs nicht hin.

vl falls mal wer zeit hat, dass er sich das anschauen kann ich poste mal die wichtigen codeabschnitte.

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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*  Jaros der Naturdruide
Version: 1.0
Autor: Simon Klausner */

#include "Jaros.hpp"
#include "Tutorial.hpp"
#include "Jaros der Naturdruide.hpp"
#include <fstream>

//Hauptprogramm

//Erstellt den Druiden und erzählt ein bischen die Geschichte

//Führt anschließend weiter zu der ersten Hauptquest

//Erstellt weiters ein kleines Startmenü

CJaros *pJaros = NULL;
CJaros Spielstand;

//////////////////////////////////////////////////////////////////////////


int main()
{ 
    cout << " rotfl.." << endl;
    sndPlaySound("C:\\Spiele\\Sounds\\Opening.wav", SND_ASYNC);
    //Variablen

    int i_Menueauswahl = 0;     
    
    //Zufallsgenerator initialisieren

    srand (timeGetTime());
    
    //Startmenue

    cout << "----------------------------------------" << endl;
    cout << "Das Abenteuer von Jaros dem Naturdruiden" << endl;
    cout << "----------------------------------------" << endl;
    cout << "++++++++++++++++++++++++++++++++++++++++" << endl;
    do 
    {       
        cout << "----Startmenue----" << endl;
        cout << "1. Spiel starten" << endl;
        cout << "2. Lies Mich" << endl;
        cout << "3. Laden" << endl;
        cout << "4. Beenden" << endl;
        cin >> i_Menueauswahl;
        
        //Je nach Auswahl weiterfahren

        switch (i_Menueauswahl)
        {
        case(1):
            {
                delete pJaros;
                pJaros = NULL;
                pJaros = new CJaros();
                cout << "Spiel wird gestartet..." << endl;
                pJaros->ZeigeDaten();
                TutorialText();
            } break;
        case (2):
            {
                cout << "Lies Mich Datei wird aufgerufen..." << endl;
                            } break;
        case (3):
            {
                cout << "Spielstand wird gesucht..." << endl;
                Laden();
            } break;
        case (4):
            {
                cout << "Spiel wird beendet..." << endl;
            } break;
        default:
            {
                cout << "Fehler in der Eingabe. Bitte erneut eingeben." << endl;
            }
        } 
    } while (i_Menueauswahl != 4);
    
    delete pJaros;
    pJaros = NULL;
    return 0;
}

//////////////////////////////////////////////////////////////////////////

//Speicher

void Speichern()
{

    Spielstand = *pJaros;
    cout << "Spielstand wird gespeichert." << endl;
    ofstream Output ("Spielstand.sps" , ios::binary);
    Output.write((char*) &Spielstand, sizeof (Spielstand));
    Output.close();
}

void Laden()
{
    //Variablen

    bool b_TuTCompleted = false;
    
    delete pJaros;
    pJaros = NULL;
    pJaros = new CJaros();

    cout << "Spielstand wird geladen." << endl;
    ifstream Input ("Spielstand.sps", ios::binary);
    Input.read((char*) &Spielstand, sizeof (Spielstand));
    *pJaros = Spielstand;
    Input.close();
        pJaros->GetQuestList(&b_TuTCompleted);
    //Tutorial erledigt und laden

    if(b_TuTCompleted == true)
        Kalksteingebirge();
}


main funktion, laden und speicher funktion.

globale variablen pJaros (Hauptheld) und Spielstand (Eben der "Spielstandheld").

so das menü funktioniert alles perfekt auch das laden geht, wenn ich gespeichert habe.

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
/*  Tutorial.cpp
Version:1.0
Autor:Simon Klausner*/

//Das Tutorial erklärt das Spiel

//Ein Testkampf den man nicht verlieren kann

//Handeln wird gezeigt


#include "Tutorial.hpp"
#include "Jaros.hpp"
#include "Items.hpp"
#include "Kampfsystem.hpp"
#include "Gegner.hpp"
#include "Jaros der Naturdruide.hpp"

extern CJaros *pJaros;

void TutorialText()
{
    //...   

}

//////////////////////////////////////////////////////////////////////////

//Kalksteingebirge


void JittsundRephs1()
{
    //..

    pJaros->TuTCompleted();
    cout << "Ihr koennt euren Spielstand nun speichern: " << endl;
    cout << "(J)a - (N)ein" << endl;
    cin >> ch_Speichern;
    if(ch_Speichern == 'j' || ch_Speichern == 'J')
    {
        Speichern();
    }
    //Kalksteingebirgshoehle laden

    Kalksteingebirge();
}

void Kalksteingebirge()
{
    //...

}

so das ist die erste mission:

das ganze cout zeug könnt ihr überlesen das ist nicht wichtig. wichtig ist dann das ende mit Speichern und Kalksteingebirge();

wenn ich eben bis zu dem punkt gespielt habe und gespeichert habe passt alles.

ich schließ die konsole und lade --> kalksteingebirge wird aufgerufen ( so solls ja auch sein und das funktioniert auch)

ABER

sobald die kalksteingebirgsfunktion dann fertig ist kommen die 2 fehler und ich weiß ned warum?

mfg
Drac



P.S.:hab das thema input output frage genannt, weil es fix daran liegt :) weil wenn ich das "savesystem" rausnehme, existieren keine fehler :)

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

17.05.2006, 15:05

Boah tu uns den Gefallen und nimm nur die wichtigen Bestandteile in deine Posts mit rein ;) . Und tu dir den Gefallen und lagere die ganzen Sätze in eine INI Datei aus. Die lassen sich schnell und leicht verändern und dein Code bleibt übersichtlich :) . Nach deiner Beschreibung würde ich mal auf ein Zeigerfehler tippen. Kennst dich mit Debuggen aus? Wenn ja schau mal nach ob und wann eine Ausnahmebehandlung geworfen wird (kommt in dem Debug Fenster).
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.

J.M.K.

Alter Hase

Beiträge: 500

Wohnort: BW Karlsruhe Ittersbach

Beruf: Schüler

  • Private Nachricht senden

3

17.05.2006, 15:43

Du brauchst auch nicht 1000 mal cout schreiben.
Das funktioniert auch so:

cout << "bla bla"
<< endl << endl
<< "bla bla";

Nur so als Tipp für weniger Schreibarbeit.
Vegetarier essen meinem Essen das Essen weg.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

17.05.2006, 16:09

Noch besser geht es per

cout << "bla bla \n\n bla bla";

aber das nur nebenher. Und am besten geht es per INI Datei ;)
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.

J.M.K.

Alter Hase

Beiträge: 500

Wohnort: BW Karlsruhe Ittersbach

Beruf: Schüler

  • Private Nachricht senden

5

17.05.2006, 16:11

Nimms mir nicht überl aber ich mag diese Dinger garnicht. Da werden die schönsten Texte zu Hieroglyphen. :P
Vegetarier essen meinem Essen das Essen weg.

6

17.05.2006, 16:32

k habs oben rausgekürzt :)

@inidatei:
naja ich finds so angenehmer, weil es im prinzip jo schn von oben nach unten alles abläuft und ich nicht extra dateien für die texte erstellen will :)

@cout << "blabla" << endl << "blabla"

hm könnt ich mir vl angewöhnen , aber auch hier find ich das irgendwie übersichtlicher, wenn man

cout <<
cout <<
etc. schreibt :) und der minimale zusatzschreibaufwand ists mir wert :)


hm irgendwer hat gemeint,dass es ein zeigerproblem ist:
muss wohl so sein, da ja das programm wegen dem zeiger *pJaros dann abstürzt, wenn das programm wieder ins hauptmenü springt :)

@debugger:
ja hab ich auch verwendet und da kommt nur in irgendeiner zeile (eben vermutlich, wenn das programm wieder in das "hauptmenue" huepft:

unerwartetet zugriff auf jaros der naturdruide.exe x00000876ff0

irgendwie sowas :D

mfg
Drac

edit:

vl noch als info,

also das programm stürzt noch ab, bevor es wieder zur menueauswahl kommt.

also der teil mit
1 - Spiel
2 - Lies
3 - Laden

dieser teil kommt gar nicht mehr zum einsatz :) davor kommt der fehler^^

7

18.05.2006, 09:59

nur noch zur info :)

hab den fehler entdecken können:

und zwar folgendes:

C-/C++-Quelltext

1
*pJaros = Spielstand;


ist falsch.

heißen muss es

C-/C++-Quelltext

1
pJaros = &Spielstand;


warum?

hm das hab ich selber nicht ganz verstanden, vl kanns mir wer erklären?

mit * greift man ja auf den WERT der variable zu und ohne * auf die Adresse.

Ich will ja aber eigentlich der Variable den Wert des Spielstandes übergeben und nicht die Adresse vom Spielstand oder?

naja funktionieren tuts jedenfalls.

falls es mir wer noch erklären kann wärs auch gemütlich :)

mfg
Drac

8

18.05.2006, 19:09

hmm nein... ich gehe da du p davor stehen hast mal davon aus das es sich dabei bereits um einen Pointer handelt... evt. kapierst du es so :D
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

Anonymous

unregistriert

9

18.05.2006, 19:11

C-/C++-Quelltext

1
2
3
#include "Jaros der Naturdruide.hpp" 

extern CJaros *pJaros; 
Bei sowas bekomm ich ja richtige zustände...

Anonymous

unregistriert

10

18.05.2006, 19:43

@nix da:

mal ganz ehrlich, schreibst du in jedem thread rein, wie dich globale variablen aufregen?

sry aber es ist gemütlicher für den HAUPTHELDEN eine globale variable zu machen, als endlos diese klasseninstanz dann zu übergeben. und es ist nur ein konsolenprogramm, das hat nichts mit nem perfektprogrammierten spiel zu tun.

lieber wär mir ne erklärung gewesen, als sich über diese globale variable aufzuregen ...

mfg
Drac

Werbeanzeige