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

01.01.2016, 13:40

Breakandoid - nichtdeklarierter Bezeichner

Hallo, ich versuche gerade das Spiel Breakanoid vom Buch zu programmieren. Nur hab ich jetzt schon längere Zeit dieses Problem und komm einfach nicht dahinter.

Und zwar bin ich gerade beim Erstellen, Rendern und beim Bewegen eines Balles. Das Intro, das Hauptmenü sowie das Rendern des Levels und des Schlägers wie auch das Bewegen des Schlägers hat bereits schon einwandfrei funktioniert.

Für die Verwaltung wird ein Klassen-Array von CBall erstellt, wo 16 Bälle platz haben und von dort verwaltet werden. Nur die Instanz "m_aBall" und natürlich sämltiche Werte die sich drauf beziehen werden beim Kompilieren als "nichtdeklarierter Bezeichner" angezeigt. Aber im Programm selbst werden sie erkannt. Ich kann den Fehler einfach nicht finden. Aber erstmal ein wenig Code.

Zuerst einmal die Klasse CBall selbst:

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
// Verwendete Symbole vordeklarieren
class CGame;

class CBall
{
public:

    // Variablen
    CGame *m_pGame;
    BOOL m_bExists;
    BOOL m_bGrabbed;
    tbVector3 m_vBallPos;
    tbVector3 m_vBallVel;

    // Konstruktor
    inline CBall()
        : m_pGame(NULL)
        , m_bExists(FALSE)
        , m_bGrabbed(FALSE)
        , m_vBallPos(0.0f)
        , m_vBallVel(0.0f)
    {
    }

    // Methoden
    tbResult Render(float fTime);
    tbResult Move(float fTime);
    tbVector3 GetAbsolutePos();

};


Jetzt dort wo der Fehler unteranderem auftritt => CGame:

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
class CGame
{
public:

    // Modelle
    tbModel *m_pLevelModel;
    tbModel *m_pPaddleModel;
    tbModel *m_pBallModel;
    tbModel *m_apBlockModel[4];

    // Variablen
    BOOL        m_bPaused;
    BOOL        m_bGameOver;
    int         m_iLevel;
    int         m_iTriesLeft;
    int         m_iScore;
    tbVector3   m_vPaddlePos;
    tbVector3   m_vPaddleVel;
    float       m_fLevelTime;

    // Instanz für Bälle
    CBall       m_aBall[16]; <-------- Hier die Instanz die nicht deklariert ist. Er sagt auch, dass vorher ein 
                                               ";" fehlt, wüsste aber nicht wo das sein könnte bzw. konnte auch nix finden.


    // Konstruktor
    inline CGame()
        : m_pLevelModel(NULL)
        , m_pPaddleModel(NULL)
        , m_pBallModel(NULL)
        , m_bPaused(FALSE)
        , m_bGameOver(FALSE)
        , m_iLevel(0)
        , m_iTriesLeft(0)
        , m_iScore(0)
        , m_vPaddlePos(0.0f)
        , m_vPaddleVel(0.0f)
        , m_fLevelTime(0.0f)
    {
        ZeroMemory(m_apBlockModel, sizeof(m_apBlockModel));
        ZeroMemory(m_aBall, sizeof(m_aBall));                <--------- Hier wird es schon nicht mehr erkannt
    }

    // Methoden
    tbResult Init();
    tbResult Exit();
    tbResult Load();
    tbResult Unload();
    tbResult Move(float fTime);
    tbResult Render(float fTime);
    tbResult InitLevel(int iLevel);
    int CreateBall(tbVector3 vPosition, tbVector3 vVelocity, BOOL bGrabbed);
    tbResult CreateBlockRow(char *pcBlocks, tbVector3 vStartPos);

};


Ich habe natürlich den Quellcode mit dem vom Buch verglichen und komm auf keine Fehler. Wie schon oben erwähnt wird überall wo "m_aBall" verwendet wird ein Fehler ausgeworfen, aber im Programmcode selbst nicht als Fehler gekennezichnet. Das Logfile sagt das die Nachrichtenschleife betreten wird, allerdings dann wieder verlässt, höchstwahrscheinlich wenn es auf "m_aBall" trifft.

Hättet ihr eine Idee an was das liegen könnte? Vl seh ich den Wald vor lauter Bäumen grad nicht, weil ich schon zu lange dran sitze 8| ?(

lg Epi

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Epiphany99« (01.01.2016, 13:47)


2

01.01.2016, 13:52

Hast du "CGame.h" in CBall.cpp includiert?

Übrigens (auch wenn es im Buch so stehen sollte) gegenseitig abhängigkeiten sprechen für ein schlechtes Codedesign. CBall kennt/braucht CGame und CGame kennt/braucht Cball.

Dein Problem könnte auch durch eventuelle IncludeGuards verursacht sein.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

3

01.01.2016, 16:13

Erstmal danke für die Antwort. Im Buch steht auch, dass es nicht die
unbedingt schönste Lösung ist :)

Also in Ball.cpp wurde nur "Breakanoid.h" inkludiert, die eig sämtliche Header-Dateien einbindet, also ja:

Breakanoid.h

C-/C++-Quelltext

1
2
3
4
5
6
#include <TriBase.h>
#include "Intro.h"
#include "MainMenu.h"
#include "Game.h"
#include "Ball.h"
#include "Resource.h"


Werd mir das mit den Guards nochmal anschauen...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Epiphany99« (01.01.2016, 16:28)


4

01.01.2016, 16:28

Nachdem ich noch weiter gesucht habe, fand ich wen, der ein ähnliches Problem hatte. Ball.h muss in Breakanoid.h VOR
Game.h eingebunden werden, auf des wär ich nie gekommen. Macht aber Sinn, da es ja in Game.h eine Klasseninstanz
von CBall gibt, muss die vorher inkludiert werden... Das werden wohl die Probleme sein die du mit den gegenseitigen
Abhängigkeiten gemeint hast, oder? :)

Es is halt nur komplett verwirrend, da man im Programm selbst keinen Fehler findet, das Logfile auch nichts hilfreiches auswirft
und schrittweise das Programm durchlaufen ging auch nicht, da ja das Programm sofort abbricht :cursing:

Es muss so ausschauen:

C-/C++-Quelltext

1
2
3
4
5
6
#include <TriBase.h>
#include "Intro.h"
#include "MainMenu.h"
#include "Ball.h"
#include "Game.h"
#include "Resource.h"

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Epiphany99« (01.01.2016, 16:38)


5

01.01.2016, 17:24

Das werden wohl die Probleme sein die du mit den gegenseitigen
Abhängigkeiten gemeint hast, oder?

Ja, genau.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

6

01.01.2016, 18:38

Danke für deine Hilfe, dann werd ich mit doppelten Abhängigkeiten
in nächster Zeit ein wenig vorsichtiger sein, bzw. gleich weglasssen :)

Lg

Werbeanzeige