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) );
    
    } // WindowProc
    

    Kompilieren:
    --------------------Konfiguration: Age of the Dragon - Win32 Debug--------------------
    Kompilierung läuft...
    main.cpp
    c:\dxsdk\include\dinput.h: DIRECTINPUT_VERSION undefined. Defaulting to version 0x0800

    main.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.


Anmelden zum Antworten