Zugriffsverletzung, was tun?



  • hallo bin gerade dabei mir ne grafik-klasse zu schreiben da so ne zugriffsverletzung jedoch nicht nur mit Direct X zu tun hat poste ich das problem mal hier. ich hoffe ihr könnt mir helfen. hier mal etwas code aufs wesentliche reduziert und in reihenfolge wie er im programm durchgearbeitet wird:

    typedef struct XXX_Bild { 
    
    	LPD3DXSPRITE sprite; // das Sprite interface der Struktur
    	LPDIRECT3DTEXTURE9 textur;
    	LPSTR dateiname; //Name der Bilddatei
    
    } XXX_Bild;
    
    //------------------------------------
    void grafik::BildVorbereiten(XXX_Bild B, LPSTR pfad)
    {
    
     B.sprite = NULL;
     ZeroMemory(&B.textur,sizeof(B.textur));
     B.textur = NULL;
     B.dateiname = pfad;
    }
    //-----------------------------------------------
    void grafik::BildLaden(XXX_Bild B)
    {
    	D3DXCreateSprite(X_device,&B.sprite);
    
    	D3DXCreateTextureFromFileEx(X_device,B.dateiname,0,0,1,0,D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT,D3DX_FILTER_NONE,D3DX_FILTER_NONE,0xFF000000,NULL,NULL,&B.textur);
    
    }
    

    Und da sind wir auch schon an dem punkt angelangt an dem es die exception gibt.

    D3DXCreateTextureFromFileEx(X_device,B.dateiname,0,0,1,0,D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT,D3DX_FILTER_NONE,D3DX_FILTER_NONE,0xFF000000,NULL,NULL,&B.textur);
    

    wirft folgende meldung:
    *first-chance exception in project1.exe (NTDLL.DLL): 0xC0000005: Access Violation.

    7788FFDE repne scas byte ptr [edi]
    *
    VC++ 6.0 Win2000

    wäre euch riesig dankbar wenn ihr mir helfen könnt.

    mfg striptease



  • einer der pointer die du benutzt zeigt auf null.

    ich sag mal nichts zu deinen typnamen, das würde nämlich übel enden 😃



  • hi danke für die antwort!

    wenn ich

    B.textur = NULL;
    

    weglasse funzt es aber immernoch nicht..oder meintest du was anderes? musmaßungen über das XXX bitte unterlassen 😉

    mfg christian



  • and ie Textur hab ich garnicht gedacht, da deine funktion die textur ja erst erstellt, wie soll das ding auch was andres als null sein?

    bekam der texturname über new char[länge des strings]; speicher zugewiesen?



  • Probier's mit strcpy(B.dateiname, pfad);



  • nein, hab für den namen (du meinst sicher B.dateiname) hab ich keinen speicher mit new reserviert, aber es handelt sich dabei ja auch um LPSTR, wir das nicht von windoof geregelt? ich werds aber mal versuchen so wie du meintest, danke für den tipp leider kann ich erst morgen wieder antworten. ich hoffe dann schaust du auch nochmal rein.

    mfg striptease



  • LPSTR =char*

    und genau DESHALB hasse ich typedefs aud standardtypen



  • Hast du das Device Objekt richtig erstellt (X_device)?
    Meiner meinung nach stimmt was mit dem Device Objekt nicht.... wahrscheinlich falsch initialisiert....

    auf meiner HP ist der Quellcode eines 2D Top Down Scrollers zu finden der D3D9 für die Grafikausgabe nutzt - kannst dir mal ansehen



  • wennd as device objekt kaputt ist, wird keine access violation geworfen, das ist ein typischer nullfehler. wenn bei directX was fehlschlägt, muss man failed abfragen, wenn nicht, ist auch nicht schlimm. ne access violation kommt genau dann vor, wenn ein nullpointer dereferenziert wird, oder manchmal, wenn man auf ein stringarray zugreift, dass keinen speicher reserviert hat.

    alle d3dx funktionen prüfen auch immer zuerst den zustand der übergebenen device objekte, dh wenn device null wär, würde direct abgebrochen, und es würde keine access-violation fliegen können.

    @Gaunlet: ganz schlechte idee, in ein array ohne speicher strings zu kopieren, das endet sicher tragisch.

    //erst grad ebend gesehen^^



  • void grafik::BildLaden(XXX_Bild B) 
     { 
         D3DXCreateSprite(X_device,&B.sprite); 
    
         /*...*/
    }
    

    Das bringt doch nichts oder?
    Du übergibst eine Bild mit call by value - es wird also ein Bild erstellt - oder sowas
    Dann gibst du die Adresse der Kopie an D3DCreateSprite
    Die Fkt macht irgendetwas
    der Ergebniss wird einfach nach ende der Fkt weggeschmiessen, weil die Kopie des übergebenen Bildes (Parameters) zerstört wird



  • hi danke euch für die antworten. also sorry dass ich danach verlange aber ich bin gerade ziemlich verzweifelt und hab im moment etwas den überblick verloren mein kopf is vol von `s und &`s, new und all sowas 😕 😕 😕 😉 deshalb habt ihr vielleicht nen codeschnipsel in dem speicher für den pfadnamen reserviert wird am besten in größe des übergebenen pfades, soll ich statt LPSTR lieber char nehmen? bin mir im klaren dass ihr nich meine codesklaven seid aber es wäre sehr nett.

    @vertexwahn hmm interessanter ansatz..s.o. plz 😞

    mfg christian



  • Benutz doch std::string...



  • directX erstmal wegwerfen, und programmieren lernen, das wäre mein ansatz bei solchen problemen(und wars auch 😉 )



  • @otze siehe sig ansonsten nm...tz


Anmelden zum Antworten