komischer Fehler
-
Hi Leute.
Ich wieder mal ein fehler den ich mir nich erklären kann,aber diesmal nicht beim Kompilieren oder Linken ,sondern beim direkten Programmstart.//Age of the dragon # include <windows.h> # include <stdio.h> # include <stdarg.h> # include <commctrl.h> # include <d3dx8.h> # include <dsound.h> # include <dinput.h> # include "dsutil.h" # include "d3dfont.h" HWND hWnd; // Prototyp der Callback-Funktion LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); //Direct X class directx { public: LPDIRECT3D8 d3d; LPDIRECT3DDEVICE8 device; D3DPRESENT_PARAMETERS d3dpp; int init(); void adjust(int breite, int hoehe); }; int directx::init() { D3DDISPLAYMODE d3ddm; D3DDEVTYPE devtype; D3DCAPS8 caps; d3d = Direct3DCreate8( D3D_SDK_VERSION); if( !d3d) return 0; if( d3d->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm) < 0) return 0; ZeroMemory( &d3dpp, sizeof(d3dpp)); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.EnableAutoDepthStencil = TRUE; d3dpp.AutoDepthStencilFormat = D3DFMT_D16; d3dpp.BackBufferFormat = d3ddm.Format; if( d3d->GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps) < 0) { MessageBox( hWnd, "Kein HAL!", "Dragon-Meldung", MB_OK | MB_ICONWARNING | MB_SETFOREGROUND); devtype = D3DDEVTYPE_REF; } else devtype = D3DDEVTYPE_HAL; if( d3d->CreateDevice( D3DADAPTER_DEFAULT, devtype, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &device) < 0) return 0; return 1; } void directx::adjust( int breite, int hoehe) { D3DXMATRIX proj; d3dpp.BackBufferWidth = breite; d3dpp.BackBufferHeight = hoehe; device->Reset( &d3dpp); device->SetRenderState( D3DRS_ZENABLE, D3DZB_TRUE); device->SetRenderState( D3DRS_AMBIENT, 0xffffff); D3DXMatrixPerspectiveFovLH( &proj, D3DX_PI/4, ((float)breite)/hoehe, 1.0f, 500.0f); device->SetTransform( D3DTS_PROJECTION, &proj); } directx mein_directx; class objekt { private: LPD3DXMESH mesh; D3DMATERIAL8 *materialien; DWORD anz_mat; LPDIRECT3DTEXTURE8 *texturen; public: objekt(); void load( char *xfile); void draw(); ~objekt(); }; objekt::objekt() { mesh = NULL; materialien = NULL; anz_mat = 0; texturen = NULL; } objekt::~objekt() { unsigned int i; if( materialien) delete[] materialien; if( texturen) { for( i = 0; i < anz_mat; i++ ) { if( texturen[i]) texturen[i]->Release(); } delete[] texturen; } if( mesh) mesh->Release(); } void objekt::load( char *xfile) { LPD3DXBUFFER buf; D3DXMATERIAL* mat; DWORD i; D3DXLoadMeshFromX( xfile, D3DXMESH_SYSTEMMEM, mein_directx.device, NULL, &buf, &anz_mat, &mesh); mat = (D3DXMATERIAL*)buf->GetBufferPointer(); materialien = new D3DMATERIAL8[anz_mat]; texturen = new LPDIRECT3DTEXTURE8[anz_mat]; for( i=0; i<anz_mat; i++) { materialien[i] = mat[i].MatD3D; materialien[i].Ambient.r = 1.0f; materialien[i].Ambient.g = 1.0f; materialien[i].Ambient.b = 1.0f; if( D3DXCreateTextureFromFile( mein_directx.device, mat[i].pTextureFilename, &texturen[i]) < 0) texturen[i] = NULL; } buf->Release(); } void objekt::draw() { unsigned int i; for( i=0; i < anz_mat; i++ ) { mein_directx.device->SetMaterial( &materialien[i]); mein_directx.device->SetTexture( 0, texturen[i]); mesh->DrawSubset( i); } } # define GAROS 0 class objekte { public: objekt Garos; void lade_objekte(); }; void objekte::lade_objekte() { Garos.load( "Garos.x"); } objekte meine_objekte; //Dragonclass class dragon { private: D3DXVECTOR3 hier_bin_ich; D3DXVECTOR3 da_gucke_ich_hin; public: int init(); void start(); void render(); }; void dragon::start() { hier_bin_ich = D3DXVECTOR3( 0.0f, 3.5f,3.0f); da_gucke_ich_hin = D3DXVECTOR3( 0.0f, 0.0f, 0.0f); } int dragon::init() { if( !mein_directx.init()) return 0; meine_objekte.lade_objekte(); return 1; } void dragon::render() { D3DXMATRIX world; D3DXMATRIX view; mein_directx.device->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(255,255,255), 1.0f, 0 ); mein_directx.device->BeginScene(); D3DXMatrixLookAtLH( &view, &hier_bin_ich, &da_gucke_ich_hin, &D3DXVECTOR3( 0.0f, 1.0f, 0.0f)); mein_directx.device->SetTransform( D3DTS_VIEW, &view); mein_directx.device->SetTransform( D3DTS_WORLD, &world); meine_objekte.Garos.draw(); mein_directx.device->EndScene(); mein_directx.device->Present( NULL, NULL, NULL, NULL); } dragon mein_spiel; // Hauptprogramm // int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpcmdline, int ncmdshow) { WNDCLASSEX windowclass; // Struktur für Fenstereigenschaften HWND hWnd; // Fenster-Handle MSG message; // Nachricht // Der Klassen-Name des Fensters ist frei wählbar const char szClassName[] = "Age of the Dragon"; // Struktur mit gewünschten Eigenschaften füllen // // Größe der Struktur zwischenspeichern windowclass.cbSize = sizeof (WNDCLASSEX); // Fenster soll beim Verschieben neu gezeichnet werden windowclass.style = CS_HREDRAW | CS_VREDRAW; // Zeiger auf Callback-Funktion windowclass.lpfnWndProc = WindowProc; // Keine erweiterten Einstellungen windowclass.cbClsExtra = 0; windowclass.cbWndExtra = 0; // Instanz speichern windowclass.hInstance = hInst; // Icons und Cursor festlegen windowclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); windowclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION); windowclass.hCursor = LoadCursor (NULL, IDC_ARROW); // Hintergrundfarbe festlegen windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND+1; // Ein Menü brauchen wir nicht windowclass.lpszMenuName = NULL; // Klassenname angeben windowclass.lpszClassName = szClassName; // Fensterklasse registrieren if (!RegisterClassEx (&windowclass) ) return (0); mein_spiel.start(); // Das Fenster erzeugen hWnd = CreateWindowEx (NULL, szClassName, "Age of the Dragon", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 800, 600, NULL, NULL, hInst, NULL); // Prüfen, ob alles glatt ging if (hWnd == NULL) return (0); // Der "Herzschlag" des Programms. // Hier werden alle Nachrichten abgeholt, // übersetzt und weitergeleitet. while (GetMessage (&message, NULL, 0, 0) ) { TranslateMessage (&message); DispatchMessage (&message); } // Programm beenden return (int)(message.wParam); } // WinMain // Callback-Funktion zur Nachrichtenverarbeitung // LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { // Messages auswerten switch (message) { case WM_PAINT: mein_spiel.render(); ValidateRect(hWnd, NULL); break; case WM_SIZE: if(wParam != SIZE_MINIMIZED) mein_directx.adjust(LOWORD(lParam),HIWORD(lParam)); break; // Fenster schließen? (Auch Alt-F4) case WM_DESTROY: { // Nachricht zum Beenden schicken PostQuitMessage (0); return (0); } // Wurde eine Taste gedrückt? case WM_KEYDOWN: { // Ja, also je nach Taste verzweigen switch (wParam) { // Wurde "Escape" gedrückt? case VK_ESCAPE: { // Ja, also Nachricht zum Beenden schicken PostQuitMessage (0); return (0); } } } break; } // Die Nachricht wurde nicht von uns verarbeitet, also // von Windows verarbeiten lassen. return (DefWindowProc (hWnd, message, wParam, lParam) ); } // WindowProcKompilieren:
--------------------Konfiguration: Age of the Dragon - Win32 Debug--------------------
Kompilierung läuft...
main.cpp
c:\dxsdk\include\dinput.h: DIRECTINPUT_VERSION undefined. Defaulting to version 0x0800main.obj - 0 Fehler, 0 Warnung(en)
Linken:´
--Konfiguration: Age of the Dragon - Win32 Debug--------------------
Age of the Dragon.exe - 0 Fehler, 0 Warnung(en)
::::::::::::::::::
Wenn ich das Programm starte kommt ein Fehler mit ABBRECHEN ODER DEBUG
als ich es dann Debugen wollte kamm dieser Fehler"Unbehandelte Ausnahme in Age of the Dragon.exe:0x0C00000005:Access Violation"
und der Debuger weißt auf folgende Zeile hin
device->Reset( &d3dpp);
habe ausprobiert sie zu löschen aber er zeigt mir all Zeilen an ,wo device drin steht.Hat jemand eine Lösung für mein Problem?
-
1. Codetags
2. Ohne mir dieses lange Elend durchzulesen würde ich sagen: device zeigt auf kein gültiges Objekt. Gegenmaßnahme: Speicher für Objekt allokieren, Konstruktor des Objektes mit dem allokierten Speicherbereich als this - Zeiger aufrufen. Oder kurz:device = new Device();
-
Wie wär's wenn du den Debugger dann auch mal benutzen würdest?
Bye, TGGC (Demo or Die)
-
Formatiere den Text das nächste mal [c/C++]
-
Das mit dem Zeiger klappt leider nich.Hab ich auch schon ausprobiert.
Wie kann mir der Debuger bei diesem Problem helfen?Mit solchen Fehlern hatte ich noch nie zu tun.

-
Droven schrieb:
Wie kann mir der Debuger bei diesem Problem helfen?Mit solchen Fehlern hatte ich noch nie zu tun.

Der Debugger kann dir genau zeigen, WO der Fehler aufgetreten ist - und mit etwas Glück auch, welche Variable wie falsch belegt ist.
Und die Fehlermeldung bedeutet, daß device auf irgendwelchen nicht initialisierten Speicher zeigt.
-
Danke das hilft mir erst einmal weiter.Ich vermute ja ,wenn ich device so initialisiere ,wie folgendes aus dem Code:
...
d3d = Direct3DCreate8( D3D_SDK_VERSION);
...
dass es dann klappen würde
aber ich weiß leider nich den entsprechenden Befehl und dessen Parameter.