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

Maxi

Treue Seele

  • »Maxi« ist der Autor dieses Themas

Beiträge: 136

Wohnort: Müncheberg

Beruf: Ich muss noch in die Schule

  • Private Nachricht senden

1

14.06.2003, 18:28

Was bedeutet dieser Fehler?

Ja, hallo, hab mich grad registriert. Ist mein erstes Post, hab auch gelich nen großes Problem:

Meine Anwendung, mit Tribase beednet mit Accesviolation 0xc0000005

Woran kann das liegen, und was besagt der Fehler eigentlich genau?

hier der code, es ist noch nicht so veil, daher zeige ich fast alles :-)...

Quellcode

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
// Datei WinMain.cpp
#include "Tribase.h"
#include "Tischtennis.h"
#include "Allgemeines.h"


tbDirect3D* g_pDirect3D;  // globales 3d-Objekt
tbTextureManager* g_pTextures;  // globales Texturmanagerobjekt

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{

    CTischtennis App;
    if(App.Init() == 2)
        MessageBox(NULL, "Vollständig initialisiert!", "OK!", MB_OK);
    else MessageBox(NULL, "Fehler", "Fehler", MB_OK);

    App.Unload();

    return 0; // hier entsthet der Fehler:
}

// Datei Tischtennis.cpp

#include "Tribase.h"
#include "Tischtennis.h"
#include "Allgemeines.h"

extern tbDirect3D*                      g_pDirect3D;
extern tbTextureManager*            g_pTextures;


CTischtennis::CTischtennis()
{
    m_fTime = 0;
    
}

CTischtennis::~CTischtennis()
{
    Unload();
}

int CTischtennis::Init()
{
  tbInit();  // Tribase initialisieren
  int Result;
  if(Result = tbDoConfigDialog(&this->m_Config))
  {
    if(Result == TB_CANCELED) return 0;
    else
    {
        // Feher im Config-Dialog
        MessageBox(NULL, "Fehler im Konfigurationsdialog", "Fehler!", MB_OK);
        return 1;
    }
  }

  g_pDirect3D = new tbDirect3D;
  if(g_pDirect3D->Init(&m_Config, "Tischtennis Version 0.1", NULL, NULL))
  {
    // Fehelr beim Initailisieren...
    MessageBox(NULL, "Fehler biem g_pDiredt3D->Init", "Fehler", MB_OK);
    Unload();
    TB_ERROR("Fehler bim Initatialisieren von tbDirect3D", 1);
  }
    
  g_pTextures = new tbTextureManager;
  if(g_pTextures->Init(16))
  {
    MessageBox(NULL, "Fehler beim Texturmanager initialisieren...", "Fehler", MB_OK);
    Unload();
    TB_ERROR("Fehelr TExturenmanager...", 1);
  }
    
  return 2;

}

tbResult CTischtennis::Unload()
{
  g_pDirect3D->Exit();        // tbD3D löschen
  TB_SAFE_DELETE(g_pDirect3D);

  g_pTextures->Exit();            // texturen löschen
  TB_SAFE_DELETE(g_pTextures);
    
  return TB_OK;

}


könnt ihr mir sagen, was da falsch ist?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

14.06.2003, 18:31

Willkommen :)
Wie bereits im C++-Forum gesagt: tbDirect3D und tbTextureManager sind statische Klassen. Du brauchst also keinerlei Zeiger auf sie zu speichern und auch kein TB_SAFE_DELETE aufzurufen. Im Buch gab es leider ein paar Codes, wo das trotzdem noch gemacht wurde (siehe "Nachträge"-Sektion).

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

14.06.2003, 18:37

Und noch etwas:
"App.Unload();" ist überflüssig, denn es wird ja auch im Destruktor von CTischtennis aufgerufen, das wäre also doppelt! Wahrscheinlich liegt dort auch der Fehler, denn der Destruktor wird am Ende von WinMain aufgerufen. Mach es lieber so in der WinMain:

CTischtennis* pApp = new CTischtennis;
// ...
delete pApp;

Maxi

Treue Seele

  • »Maxi« ist der Autor dieses Themas

Beiträge: 136

Wohnort: Müncheberg

Beruf: Ich muss noch in die Schule

  • Private Nachricht senden

4

14.06.2003, 18:49

Danke :) jetzt geht es.
Aber dann kommt gleich noch das nächste Problem, in dem ich die TsichtennisPlatte initialisiere:

Ich schreibe nur den wichtigen Code hin:

Quellcode

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
// Das Vertex-FVF
#define VERTEX_PLATTE_FVF (D3DFVF_XYZ | D3DFVF_TEX1)

// Vertex-Struktur:
struct SVertexPlatte
{
    tbVector3 vPos;
    tbVector2 vTex;
};

class CPlatte
{
//...
tbVertexBuffer* m_Vertizes;   // vertex und Indexbuffer
tbIndexBuffer*  m_Indizes;


// die Fehelr-Funktion:
tbResult CPlatte::Init()
{

//..

// hier tritt wieder 0xc000005 auf.
if(m_Vertizes->Init(8 * sizeof(SVertexPlatte), sizeof(SVertexPlatte), VERTEX_PLATTE_FVF, D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, D3DPOOL_MANAGED))
{
  // fehler beim ERstellen des Vertexbuffers...
  MessageBox(NULL, "Fehler Bei VertBuffer-Ini", "Fehler!", MB_OK);
  TB_ERROR("Fehler beim VertexBuffer", TB_ERROR);
}

};


Was ist denn diesmal der Fehler? Diesmal sind es ja keine statsichen Klassen.

Gruß, Maxi

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

14.06.2003, 18:50

Reservierst Du denn irgendwo Speicher für den m_Vertizes-Zeiger? Mit new natürlich.

Maxi

Treue Seele

  • »Maxi« ist der Autor dieses Themas

Beiträge: 136

Wohnort: Müncheberg

Beruf: Ich muss noch in die Schule

  • Private Nachricht senden

6

14.06.2003, 18:55

ne, hab ich nicht, aber jetzt, und was passiert? wieder 0xc00005, aber diesmal bei der Zeile hier:

Quellcode

1
m_Vertizes = new tbVertexBuffer;



was heißt der Fehler eigentlich?

Gruß, Maxi

PS, ich find es lustig, wenn alle 3 Minuten eine Antwort kommt :)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

14.06.2003, 18:56

Zeig mal, wo Du CPlatte::Init aufrufst. Ich habe da so einen Verdacht! ;)

Maxi

Treue Seele

  • »Maxi« ist der Autor dieses Themas

Beiträge: 136

Wohnort: Müncheberg

Beruf: Ich muss noch in die Schule

  • Private Nachricht senden

8

14.06.2003, 18:58

ok , also ich rufe sie nach dem Initialisierren von dem Texturmanager und von tbD3D auf, und zwar so:

Quellcode

1
2
3
4
5
6
7
8
9
tbResult CTischtennis::Init()
{

//..
// initialsierung von tbD3D  und Tex-Man

if(m_Platte->Init())
  TB_ERROR("Fehelr bei Platte-Ini", TB_ERROR);
}


Und bestätigt sich der Verdacht?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

14.06.2003, 19:00

Kann ich noch nicht sagen... kann es sein, dass Du den m_Platte-Zeiger ebenfalls nicht initialisiert hast? Also mit new.

Maxi

Treue Seele

  • »Maxi« ist der Autor dieses Themas

Beiträge: 136

Wohnort: Müncheberg

Beruf: Ich muss noch in die Schule

  • Private Nachricht senden

10

14.06.2003, 19:03

ja, jetzt geht es. Danke.

Muss ich also für jeden Zeiger den ich erstelle eine Adresse mti new zuweisen?

Ich dachte, das ist nur so, wenn man den Zeiger noch außerhalb der Funktion/dem Block braucht. Aber ich habe ja schon in der Klassendefinition einen Zeiger erstellt.

Aber trotzdem Danke, jetzt geht es und ich kann mich an das Speichern der Vertizes und Indizes machen.

Gruß, Maxi

Werbeanzeige