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

23.04.2008, 18:34

Probleme bei Zugriff aus einer Klasse in die andere

Hallo Leute,
ich bin jetzt nachdem ich mich mit der Theorie geplagt habe in die Praxis übergegangen.

Ich bin dabei mit der TB Engine ein kleines Spielchen zu schreiben (Vorbild->http://www.ikspeel.nl/?act=play&id=683)

Nun gibt es da unter anderem 2 Klassen ,CPlayer und CBlock (Hindernisse)
wenn ich jetzt mit der Methode tbSphereHitsSphere(...) aus der Datei CPlayer auf die Positionsvariable von CBlock(m_vPosition) zugreife gibt es zu Laufzeit (nicht im Debugger) einen Fehler. (unbekannte Ausnahme)

Hier der Code von CPlayer cpp. und h.

Header:

C-/C++-Quelltext

1
CBlock* m_pBloock[64]; // Zeiger auf blöcke



cpp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//Init:

for(DWORD dwBlock = 0;dwBlock < 64;dwBlock++)
{
m_pBlock[dwBlock] = &m_pGame->m_aBlock[dwBlock]; //Zuweisen

}



//.....


bool CPlayer::CheckAllCollision()
{

for(DWORD dwBlock = 0;dwBlock < 64;dwBlock++)
{
if(tbSphereHitsSphere(m_vPosition ,1,m_pBlock[dwBlock]->m_vPosition/*Hier tritt der Fehler auf*/,1))return true //Kollision?

}

return false; //keine Kollision?

}


Ich bin mit meinem (noch spärlichen) Latein am Ende und hoffe, das ihr mir helfen könnt.

Schon mal danke im Vorhinein.

mfg MMAnfänger[/code]

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

23.04.2008, 18:51

Hi

Zitat

CBlock* m_pBloock[64]; // Zeiger auf blöcke


Bis du sicher, dass du ein Array von 64 Zeigern auf CBlock haben willst?
(ich denke mal, dass du sowieso m_pBlock schreiben wolltest. Ist ja sonst ein anderes Array, als du unten benutzt.)

Was hat den dwBlock für einen Wert, wenn er crasht? Kling nämlich so, dass du entweder auf einen Bereich, der nicht existiert zugreifst, oder kein gültiger Zeiger dort wartet.

3

23.04.2008, 19:49

Hi again

Zitat von »"drakon"«


(ich denke mal, dass du sowieso m_pBlock schreiben wolltest. Ist ja sonst ein anderes Array, als du unten benutzt.)

jop. Naja, 64 ist nur so ein Testwert, wird wahrscheinlich noch runtergesetzt.

Zitat von »"drakon"«


Was hat den dwBlock für einen Wert, wenn er crasht? Kling nämlich so, dass du entweder auf einen Bereich, der nicht existiert zugreifst, oder kein gültiger Zeiger dort wartet.


hmmm, was meinst du genau damit?
es crasht beim ersten Durchgang, also dwBlock == 0

Aber solche Probleme mit dem Zugreifen hatte ich schon vorher.
z.B. hatte ich in der Funktion CPlayer::Render
zuerst die Translation und dann
so ungefähr:

C-/C++-Quelltext

1
if(m_pGame->m_pPlayerModel[...]->Render())TB_ERROR();


gab auch ungefähr den selben Fehler.
Jetzt mache ich das in der CGame::Render() Funktion

Was mache ich falsch?


mfg MMAnfänger

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

23.04.2008, 19:56

Ich meine damit, dass du hier:

C-/C++-Quelltext

1
m_pGame->m_aBlock[dwBlock];


Einen Fehler drin hast und der Zeiger/das Objekt nicht mehr gültig ist. Wenn die Range stimmt, wird es an dem liegen, dass du kein gültiges Objekt hast. Wie erstellst du dann den Block in der Funktion?

5

23.04.2008, 20:04

hmmm, das ist ja gerade das mysteriöse

eigentlich wollte ich den Block
mit einer for Schleife und

C-/C++-Quelltext

1
m_pBlock[dwBlock] = new CBlock;


erstellen, aber das hat nicht funktioniert und war (komischerweise) nicht? nötig.
Das Rendern und alles andere hatte geklappt, nur beim Zugriff aus ner anderen Klasse kommt der Fehler.

mfg MMAnfänger

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

23.04.2008, 20:14

Zitat von »"MMAnfänger"«

hmmm, das ist ja gerade das mysteriöse

eigentlich wollte ich den Block
mit einer for Schleife und

C-/C++-Quelltext

1
m_pBlock[dwBlock] = new CBlock;


erstellen, aber das hat nicht funktioniert und war (komischerweise) nicht? nötig.
Das Rendern und alles andere hatte geklappt, nur beim Zugriff aus ner anderen Klasse kommt der Fehler.

mfg MMAnfänger


In deinem Fall kannst du auch das machen:

C-/C++-Quelltext

1
CBlock m_pBloock[64]; // Zeiger auf blöcke 


Dann musst du die nichteinmal noch "irgendwo" erzeugen.

Allerdings ist das sehr beschränkt und du kannst keine Blöcke dynamisch erstellen.
Wie gesagt. Es KANN gut gehen, wenn ein Zeiger deletet worden ist, muss aber nicht.
Wie erstellst du dann die Blöcke? Der Code wäre auch noch wichtig.

7

23.04.2008, 20:33

Naja, wenn man von erstellen reden könnte...

Soviel ich weiß rufe ich nur die Init Funktion auf, wo alle Variablen auf den Startwert gesetzt werden.

Wenn ich recht überlege, habe ich auch bei CPlayer keine Instanz mit

C-/C++-Quelltext

1
new
erzeugt.
Das würde ja je nach dem das fehlschlagen der Renderfunktion bescheinigen.

OK, ich werd es morgen noch mal mit new versuchen.
(morgen, weil ich noch nicht sooo alt bin, morgen schule ist und eltern in der nähe sind...
;) ) Wenn es auch dann nicht funktioniert melde ich mich noch mal.

vielen Dank für deine Hilfe schonmal

mfg MMAnfänger

PS: Eine Frage:

wäre die Erstellung auch in der Init-Methode z.B.: so möglich?

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
class CGame;

class CBlock
{
public:

tbVector3 m_vPosition;
CGame* m_pGame;
int iIndex;    // Index im Array


//etc...


tbResult Init(tbVector3 vPosition, int Index);
};


tbResult CBlock::Init(tbVector3 vPosition, int Index)
{
m_vPosition = vPosition;
iIndex = Index;

m_pGame->m_pBlock[iIndex] = new CBlock;
}

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

8

23.04.2008, 20:53

C-/C++-Quelltext

1
m_pGame->m_pBlock = new CBlock [iIndex]; 


Wenn schon. Sofern m_pGame gültig ist, kannst du das auch schon im ctor machen.

Allerdings habe ich das Gefühl, dass du ein wenig unordnung im Code hast.

Warum z.B hält ein Block einen Zeiger auf CGame?! Und warum initialisierst in CBlock ein Array von Blöcke?!!

Das sollte eher so sein, dass CGame eine Liste (oder meinetwegen auch ein Array) von CBlock hält. Und diese auch erstellt bzw. löscht.
Ich denke mal, wenn du dir nochmal Gedanken über die Struktur machst, erledigt sich ein Problem von alleine..

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

23.04.2008, 21:43

Zitat von »"drakon"«

...


Wenn sein Array wie ganz zu Beginn deklariert ist (CBlock* m_pBloock[64]; // Zeiger auf blöcke) dann macht er das schon richtig...
@D13_Dreinig

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

10

23.04.2008, 21:49

Zitat von »"David_pb"«

Zitat von »"drakon"«

...


Wenn sein Array wie ganz zu Beginn deklariert ist (CBlock* m_pBloock[64]; // Zeiger auf blöcke) dann macht er das schon richtig...


Aso, ja Richtig. Sorry.
War durch die Struktur ein wenig verwirrt.. ;)

Werbeanzeige