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; // WindowDann 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 Flagmeldet 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/hqhdcpAnsonsten 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
deleteaufrufen. Prüfe noch mal, ob dumainwindownicht doch vorher schon freigibst.
-
Hab den Quellcode mal aus free und delete abgesucht, und ich gebe mainwindow nur einmal frei.
-
Alternativ: du setzt
mainwindowzwischendurch 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.