struct pointer



  • Ich habe mehrere structs welche so aussehen:

    typedef struct {									// Structure For Keyboard Stuff
    	bool keyDown [256];								// Holds TRUE / FALSE For Each Key
    } Keys;												// Keys
    
    typedef struct {									// Contains Information Vital To Applications
    	HINSTANCE			hInstance;					// Application Instance
    	LPWSTR				className;					// Application ClassName
    } Application;										// Application
    
    typedef struct {									// Window Creation Info
    	Application*		application;				// Application Structure
    	LPWSTR				title;						// Window Title
    	int					width;						// Width
    	int					height;						// Height
    	int					bpp;						// Bits Per Pixel
    	bool				fullscreen;					// fullscreen flag
    } WindowInit;										// WindowInit
    
    typedef struct {									// Fenster Informationen
    	Keys*				keys;						// Key Structure
    	HWND				hWnd;						// Fensrer Handle
    	HDC					hDC;						// Device Context
    	HGLRC				hRC;						// Rendering Context
    	WindowInit*		init;						// Fenster Initialisierung
    	bool				visible;					// Fenster sichtbar?
    	bool				active;						// Ist Fenster aktiv?
    } Window;											// Window
    

    Dann deklariere ich mein "mainwindow" so global:

    Window* mainwindow;
    

    Wenn ich die Daten am Anfang der WinMain aber so initialisieren will:

    mainwindow->init->application->className = _T("OpenGL");			// Application Klassenname
    mainwindow->init->application->hInstance = hInstance;				// Application Instanz
    mainwindow->init->title			= _T("OpenGL");						// Fenster Titel
    mainwindow->init->width			= 640;								// Fenster Breite
    mainwindow->init->height		= 480;								// Fenster Hoehe
    mainwindow->init->bpp			= 32;								// Bits Per Pixel
    mainwindow->init->fullscreen	= false;							// Fullscreen Flag
    

    meldet der Debugger das hier:

    Eine Ausnahme (erste Chance) bei 0x00412ada Window.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000010.
    Unbehandelte Ausnahme bei 0x00412ada in Window.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000010.
    

    Nun weiß ich leider nicht wieso, denn ein NULL-Pointer ist es ja nicht. Und für andere Fehlerquellen scheint mein Wissen nicht auszureichen.

    Wäre nett wenn mir einer helfen könnte, wie man den Fehler beheben kann 🙂



  • hey das "no_" ist für no_code reserviert... such dir ein anderes präfix

    @edit und gib doch deinen zeigern auch speicher sonst wird das nix 😞



  • ...ist ja schon gut.
    Woher soll ich denn wissen, dass es einen no_code gibt?
    Wollte damit nur zum Ausdruck bringen, dass es um pointer geht.



  • Window* mainwindow = new Window();
    mainwindow.init = new WindowInit();
    mainwindow->init.application = new Application();
    

    versuch doch mal sowas an den anfang deiner main zu schreiben und dann natürlich auch die delete orgie am ende

    delete mainwindow->init.application;
    delete mainwindow.init;
    delete mainwindow;
    


  • falls dir das wie mir nicht gefällt mach die sternchen in z.11/24 raus dann brauchst nur ein

    Window* mainwindow = new Window();
    
    delete mainwindow;
    

    dann müssen aber auch bis auf die ersten alle -> durch . ersetzt werden

    mainwindow->init.application.className = _T("OpenGL");
    ...
    


  • Grundsätzlich musst du Zeiger initialisieren. Aber so wie no_code würd ichs nicht machen. Wenn du den Speicher jedes Mal im Anwendercode derart verschachtelt anfordern und wieder umgekehrt freigeben musst, hat das keine Zukunft. ⚠

    Falls du C programmierst, schreib dir Create- und Destroy-Funktionen, welche die ganze Initialisierungs- und Aufräumarbeit abnehmen (das schliesst korrekt initialisierte Member ein):

    Window* CreateWindow(/* Parameter hier */);
    void DestroyWindow(Window* window);
    

    Für C++: Kapsle das Ganze mit Klassen, die sich selbst verwalten und für genügend Speicher sorgen. Das hat Zukunft! 💡



  • willst mich ärgern 😕



  • Ich habs am Anfang natürlich nur mit

    new Window;
    

    probiert und window->init etc. ganz vergessen.
    Jetzt funktioniert zwar fast alles, aber ich bekomme es irgendiwe nicht hin ein Fenster Handle und einen Device Kontext zu erstellen.
    Zwar geben CreateWindowEx und GetDC true zurück, aber mein Programm schließt direkt wieder und im Debugger steht folgendes:
    http://yfrog.com/hqhdcp

    Ansonsten kann ich jetzt alles korrekt initialisieren und löschen.
    Mit den Klassen realisiere ich das ganze dann, wenn erstmal die grundlegen Dinge laufen 🙂



  • Ist mehr ein WinAPI-Problem. Kann einer der Moderatoren den Thread verschieben?



  • Hallo,
    ich muss den Thread nochmal ausgraben 😉
    Es funktioniert zwar jetzt alles wenn ich Debugge, aber wenn ich für Release kompiliere kommt immer eine Zugriffsverletzung, wenn ich das Programm schließe.
    Diese Zeile löst sie aus:

    delete mainwindow;
    

    Und da ich gelernt habe, das zu jedem new ein delete gehört verwundert mich das ganze jezzt, wieso das nicht klappt. Soll ich das delete einfach weg lassen oder wie?



  • Sieht so aus, als würdest du mehrmals delete aufrufen. Prüfe noch mal, ob du mainwindow nicht doch vorher schon freigibst.



  • Hab den Quellcode mal aus free und delete abgesucht, und ich gebe mainwindow nur einmal frei.



  • Alternativ: du setzt mainwindow zwischendurch auf einen entweder schon freigegebenen Pointer oder einen nie angeforderten. Also schememhaft:

    int* a = new int;
    int* mainwindow = new int;
    //...
    mainwindow = a;  // Speicherleck, aber erstmal unwichtig
    //...
    delete a;
    //...
    delete maindow;  // Autsch, obwohl nur einmal freigegeben
    


  • Ich habe genau nur ein new und ein delete in meinem Code und sowas wie mainwindow = xyz ist auch nicht dabei.



  • Also ein mainwindow->x.y.z = 10 habe ich schon drin. Vor dem delete habe ich auch mal Zero Memory ausprobiert. Doch beim schließen wird immer der Haltepunkt ausgelöst, wie wenn man F12 drückt während das Programm läuft.



  • Hier kann dir so aber niemand wirklich helfen. Zeig Code oder bastel am besten ein Beispiel, wo dieser Fehler auch auftritt.


Anmelden zum Antworten