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

08.04.2010, 16:13

Jo, ich würds mir nach nem Neustart nochmal angucken. Außerdem brauchst du dir die Variable nicht extra ausgeben lassen, kannst dir auch kurz im Debugger angucken.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

12

08.04.2010, 16:15

Zeig mal etwas code...

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

13

08.04.2010, 16:35

Intern werden bool-Variablen ja meistens als Byte gespeichert.
Vielleicht überschreibst du irgendwo Speicher?

Käsekönig

1x Contest-Sieger

  • »Käsekönig« ist der Autor dieses Themas
  • Private Nachricht senden

14

08.04.2010, 19:19

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
class CLogic
{
public:
    CLogic(sf::RenderWindow *RenderWin);

    void Update(Gamestate *Gamestate, float fFrametime);
    int m_AnDerReihe;
    int m_Dran;
    int m_NrKarteMitte;
    int m_NrKarteSpieler;
    int m_Atout;
    bool m_bAtout;
    bool m_bGemischt;
    float m_fTime;
    float m_fTime1;

    bool m_bKlick;

    int m_Runde;

    int m_Ausgespielt;

    int m_KartenMitte[4];

    bool m_bFirst; //Hier ist meine Variable, die Probleme bereitet

    void Reset();

    void Spielen(int Spieler);


    //4 Spieler
    CPlayer *m_pPlayer1;
    CPlayer *m_pPlayer2;
    CPlayer *m_pPlayer3;
    CPlayer *m_pPlayer4;

    enum Spielkarten
    {
        HERZ_ASS, HERZ_ZEHNER, HERZ_KOENIG, HERZ_DAME, HERZ_BUB,
        KRAUT_ASS, KRAUT_ZEHNER, KRAUT_KOENIG, KRAUT_DAME, KRAUT_BUB,
        EICHEL_ASS, EICHEL_ZEHNER, EICHEL_KOENIG, EICHEL_DAME, EICHEL_BUB,
        KUGEL_ASS, KUGEL_ZEHNER, KUGEL_KOENIG, KUGEL_DAME, KUGEL_BUB
    };
    enum Farben
    {
        HERZ, KRAUT, EICHEL, KUGEL
    };

private:
    std::vector<int> Karten;

    bool m_bMischen;
    bool m_bStartCounter;

    int m_SpielerSpielt;
    int m_Spiel;
    

    void Mischen();

    sf::Rect<float> RectKarte1;
    sf::Rect<float> RectKarte2;
    sf::Rect<float> RectKarte3;
    sf::Rect<float> RectKarte4;
    sf::Rect<float> RectKarte5;
    sf::Rect<float> RectKarte6;

    sf::RenderWindow *m_App;

    bool Kollision(sf::Vector2f Position, sf::Rect<float> Rect);
};


Im Konstruktor werden ein paar Sachen erledigt, unter anderem ruf ich die Funktion Reset() auf.

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
void CLogic::Reset()
{
    m_bFirst = true; //Wenn ich mir direkt hier danach den Wert von m_bFirst in der Konsole ausgeben lasse, steht dort 1.

    m_bStartCounter = true;

    m_Atout = 4;

    m_bKlick = true;
    
    //Wurde das Atout schon ausgewählt?
    m_bAtout = false;

    m_SpielerSpielt = m_AnDerReihe + 1;
    m_Spiel = NORMALES_SPIEL;

    for(int i = 0; i < 5; i++)
        m_KartenMitte[i] = 20;


    m_Runde = 1;

    m_fTime1 = 0.0f;
}


Nach dem im Konstruktor Reset() aufgerufen wurde, hab ich mir m_bFirst wieder ausgeben lassen. Und sieh an, die Variable hat den Wert 20.

CGame hält wiederum eine Instanz von CLogic.
Membervariable: CLogic *m_pLogic
Und im Konstruktor: m_pCards = new CCards(App, m_pLogic);


Werd das jetzt mal mit dem Debugger durchgehen, vielleicht kann ich so etwas heraus finden.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

15

08.04.2010, 19:24

Der Fehler ist doch offensichtlich, typischer Buffer-Overrun.

Wo kommt in deinem Code eine 20 vor!?
.
.
.

Richtig m_KartenMitte hat nur 4 Elemente ;)

Käsekönig

1x Contest-Sieger

  • »Käsekönig« ist der Autor dieses Themas
  • Private Nachricht senden

16

08.04.2010, 19:29

Dankeschön, das war natürlich Schuld...
Ursprünglich hatte das auch 5 Elemente, dann hab ichs auf 4 geändert, bei der Initialisierungsschleife aber vergessen. Dankeschön.
Dass ich das nicht selbst gesehen hab!^^

Wie meinst du das, wo in meinem Code eine 20 vor kommt?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

17

08.04.2010, 19:35

hier kommt sie vor:

C-/C++-Quelltext

1
2
for(int i = 0; i < 5; i++)
        m_KartenMitte[i] = 20;


er hat das gefragt weil deine boolvariable den wert 20 zugewiesen bekommen hat.

für solche sachen sollte man sowieso std::vector oder wenigstens sizeof benutzen.

C-/C++-Quelltext

1
2
for(int i = 0; i < sizeof(KartenMitte)/sizeof(KartenMitte[0]); i++)
        m_KartenMitte[i] = 20;


und schon kannst du die größe so oft verändern wie du willst ohne etwas vergessen zu können.
"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?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

18

08.04.2010, 19:46

Oder eine Konstante machen für die Größe des Arrays...

Käsekönig

1x Contest-Sieger

  • »Käsekönig« ist der Autor dieses Themas
  • Private Nachricht senden

19

09.04.2010, 00:15

Okay, danke für die Tipps. ;)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

20

09.04.2010, 08:30

Ein wunderbarer Thread mit einem mysteriösen Rätsel zu Beginn und der Erleuchtung am Ende :)

Werbeanzeige