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

19.05.2008, 19:03

Fehler beim Rendern eines Balls

Hi Forum!
Bei meinem eigenen kleinen Testprojekt will ich ein paar Objekte zeichnen lassen. Darunter auch ein Ball und ein Würfel. Diese sind in unterschiedliche Dateien unterteilt. Wenn ich jetzt in der Render-Funktion des Balles (CBall::Render) den Ball rendern lassen will, schmiert das Programm ab.
Das Debug-Fenster zeigt folgendes an:
"Unbehandelte Ausnahme bei ... in ... .exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000."

Das komische daran ist, dass ich in der Ball-Render-Funktion auch kein Würfel zeichnen lassen kann (gleicher Fehler), in der Würfel funktion jedoch alles funktioniert. Woran könnte das liegen?

*ratlosigkeit*

Vielen Dank schonmal.

BlazeX

Alter Hase

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

2

19.05.2008, 19:10

könntest du eventuell ein bisschen mehr Code zeigen?

Hast du das FVF für den Ball gesetzt?

tnecniv

Treue Seele

Beiträge: 164

Wohnort: BERLIN

  • Private Nachricht senden

3

19.05.2008, 19:42

ich find das sieht n bisschen so aus, als würde es dein ball objekt gar nicht geben, dass die render funktion aufruft... irgend wo ist da ein null-pointer. geh doch einfach mal mit dem debugger durch. dann weißt du wos kracht und wenn du dann nicht selber auf eine lösung kommst, noch mal posten.
Gruß

EDIT: dann aber mit entsprechendem codeausschnitt + kontext
Sagt der igel zu dem dachs:
willst du größer sein, dann wachs!
- alte Fritz weisheit

4

19.05.2008, 21:27

Zitat

Hast du das FVF für den Ball gesetzt?

nein, hab ich aber auch bei dem würfel nicht. die modelle sind .tbm dateien, also welche für die TriBase engine. beim würfel funktionierts, und auch beim beispielprogramm wirds nicht gemacht.

Zitat

ich find das sieht n bisschen so aus, als würde es dein ball objekt gar nicht geben, dass die render funktion aufruft... irgend wo ist da ein null-pointer.

sieht mir auch so danach aus. mir sagte mal einer, dass "0xC0000005" Nullpointer bedeute. Aber von der Würfel-Render-Funktion lässt sich der Ball ja rendern! und von der Ball-Render-Funktion lässt sich nichts rendern! komisch!?

code:

Klasse CBall (die header-datei):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Verwendete Symbole vordeklarieren

class CGame;

// Klasse für einen Ball

class CBall
{
public:
    CGame*      m_pGame; // Zeiger auf die Spielklasse


    // Konstruktor

    inline CBall() {ZeroMemory(this, sizeof(CBall));}

    // Methoden

    tbResult    Move(float fTime);      // Bewegen

    tbResult    Render(float fTime);    // Rendern

...
...
};


in der würfelklasse ist das eigentlich gleich.

ball-render-funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
tbResult CBall::Render(float fTime)
{
    tbMatrix mWorld;

    // Ball rendern

    tbDirect3D& D3D = tbDirect3D::Instance();
    D3D.Instance().SetTransform(D3DTS_WORLD, tbMatrixTranslation(GetAbsPosition()));
    m_pGame->m_pBallModel->Render(); // hier der fehler



    return TB_OK;
}


in der würfel-render-funktion eigentlich das gleiche.

die spiel-klasse (header-datei):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Klasse für das Spiel

class CGame
{
public:
    // Variablen

    tbModel*                    m_pBallModel;
    tbModel*                    m_apBlockModel[3];

    // Konstruktor

    inline CGame() {ZeroMemory(this, sizeof(CGame));}

    // Methoden

    tbResult                    Init();
    tbResult                    Exit();
    tbResult                    Load();
    tbResult                    Unload();
    tbResult                    Move(float fTime);
    tbResult                    Render(float fTime);
...
...
};


die verwaltungsklasse bindet alle header-dateien ein. jede .cpp datei, also die mit den jeweiligen render-funktionen bindet die verwaltungsklassen-datei ein.

so wie in den beispielprogrammen. wenn ich übrigens irgendwas mit dem zeiger auf die spielklasse (m_pGame von CGame*) von den balldateien mache, gibts wieder einen absturz. bei den würfeln aber nicht!

5

19.05.2008, 21:29

Autsch ... was soll denn dieses ZeroMemory da? Wo kopiert ihr sowas unkonformes immer her?!
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

tnecniv

Treue Seele

Beiträge: 164

Wohnort: BERLIN

  • Private Nachricht senden

6

19.05.2008, 22:01

Zitat von »"defaultplayer^^

wenn ich übrigens irgendwas mit dem zeiger auf die spielklasse (m_pGame von CGame*) von den balldateien mache, gibts wieder einen absturz. bei den würfeln aber nicht!


hä? na dann is die sache ja wohl klar, oder nicht? dein m_pGame wird nicht richtig initialisiert. guck doch einfach mal wann du dieser variblen was zuweist (wenn überhaupt). wenn dus wieder nicht findest: post mit code..
Sagt der igel zu dem dachs:
willst du größer sein, dann wachs!
- alte Fritz weisheit

7

19.05.2008, 22:11

Zitat

hä? na dann is die sache ja wohl klar, oder nicht? dein m_pGame wird nicht richtig initialisiert.


das dachte ich mir irgendwie schon. nur wieso? und vorallem, was kann ich dagegen machen? das ist ja fast wie wenn ich ner variable 4 zuweis und sie hat nachher 7 oder so!?

Zitat

guck doch einfach mal wann du dieser variblen was zuweist (wenn überhaupt).


das ist keine zuweisung, aber trotzdem von sehr großer bedeutung: das rendern:

C-/C++-Quelltext

1
m_pGame->m_pBallModel->Render();


das funktioniert auch schon nicht

C-/C++-Quelltext

1
int a = m_pGame->m_vBallPosition.x;


Zitat

Autsch ... was soll denn dieses ZeroMemory da? Wo kopiert ihr sowas unkonformes immer her?!

ich bin noch ganz neu in der spieleprogrammierung. hab das buch "3D Spieleprogrammierung mit DX9 und C++" von David Scherfgen.
am anfang glaubt man ja meistens das, was da steht? und so wars eben auch im beispielprogramm....


also falls jemand ne idee gegen das

Zitat

dein m_pGame wird nicht richtig initialisiert
hat, wär ich ihm sehr dankbar!

wie gesagt: bin am anfang, und einfach nur ratlos...
und wenn jemand noch ein buch empfehlen kann: nur her damit! (aber nur durch eigene erfahrung, bitte!).
sonst überleg ich auch nochmal ein c++ buch zu kaufen... evtl das von bjarne stroustrup...aber auf englisch...obwohl ich noch nicht so englisch kann...lerns ja noch^^

tnecniv

Treue Seele

Beiträge: 164

Wohnort: BERLIN

  • Private Nachricht senden

8

19.05.2008, 22:16

haaaaaallo! du sollst den codeabschnitt zeigen, wo du m_pGame irgendwas zuweist bzw. wo du dein ball objekt erstellst! entschuldige bitte, aber hier kann keiner hellsehen... puh :)
gruß

EDIT:

Zitat

das ist keine zuweisung, aber trotzdem von sehr großer bedeutung: das rendern:


das rendern kannste knicken, solange m_pGame null ist! :roll:
genauso wie irgendwelche zuweisungen, wo m_pGame im spiel is.. :roll: :roll:
Sagt der igel zu dem dachs:
willst du größer sein, dann wachs!
- alte Fritz weisheit

9

19.05.2008, 22:43

Zitat

du sollst den codeabschnitt zeigen, wo du m_pGame irgendwas zuweist bzw. wo du dein ball objekt erstellst!

ah, ok!

m_pGame ist ein Zeiger, der in der Ballklasse erstellt wird.

das sieht so aus. folgendes steht in der klassendefinition des balls:

C-/C++-Quelltext

1
CGame*      m_pGame;        // Zeiger auf die Spielklasse


CGame ist hier die Spielklasse, und davon wird der m_pGame-Zeiger erstellt. der soll helfen, von der ball-klasse auf die spielklasse zuzugreifen, was beim würfel auch funktioniert. mehr wird damit nicht gemacht, außer eben damit auf die sachen zuzugreifen. und das nur beim rendern.

das ballobjekt wird in der CGame klasse erstellt, also dort, worauf ich den m_pGame zeiger habe.

in der klasse sieht das so aus:

C-/C++-Quelltext

1
tbModel*                    m_pBallModel;

(hoffe dass du das wolltest)

die .tbm datei wird dann in CGame::Load() reingeladen, was denke ich unwichtig ist, denn ich kanns ja von der würfel-.cpp-datei rendern!

es stimmt wohl was mit der verbindung zwischen den beiden dateien (ball und gcame) nicht, obwohl ich es im grunde gleich gemacht hab, wie mit den würfeln.
ich hoffe, dass das das ist, was du meintest...

tnecniv

Treue Seele

Beiträge: 164

Wohnort: BERLIN

  • Private Nachricht senden

10

19.05.2008, 22:53

nein, nicht so richtig... :)

du hast die klasse CBall, richtig? richtig! du musst doch jetzt aber irgendwo eine Instanz in form eines objektes dieser klasse erstellen, um dann die rendermethode dieses objektes aufzurufen. ok? so, und wenn du nun dieses objekt erstellst wird es ddank deines konstruktors komplett genullt. d.h. das dein m_pGame-zeiger de facto zunächst ein mal ins nichts zeigt. folglich musst du doch nach dem erstellen des objektes der variablen m_pGame erstmal eine adresse zuweisen. am besten machst du das gleich im konstruktor.
Sagt der igel zu dem dachs:
willst du größer sein, dann wachs!
- alte Fritz weisheit

Werbeanzeige