Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

13.05.2016, 13:44

Wie sähe es denn aus, würdest du inneinander ein weiteres erstellen? Käme es nicht zu einer unendlichen Rekursion?

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

12

13.05.2016, 13:50

Im Prinzip ja. Aber es bricht gleich mit der Exception ab.

Ich habe aber dafür gesorgt, dass es zu keiner Rekursion kommt ;)
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

13

13.05.2016, 13:59

Wie bereits geschrieben liegts wohl an der Fensterklasse. Entweder erstellst du für jedes Fenster eine eigene Fensterklasse mit eigenem Namen oder erstellst nur eine einzige, welche dann für alle Fenster benutzt wird.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

14

13.05.2016, 14:05

Was schon merkwürdig ist, du sagst selbst du musst sie zwei mal registrieren da du sonst einen Fehler bekommst. Irgendwas scheinst du da schon falsch zu machen. Anstatt also irgendwie um die Symptome herum zu doktern würde ich an der Stelle lieber versuchen das eigentliche Problem zu lösen. Dann hat sich möglicherweise auch das Problem hier erledigt.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

15

13.05.2016, 14:10

Die Fensterklasse hat bereits einen anderen Namen.

Im Kontext wird ein Fenster wie folgt instanziert:

C-/C++-Quelltext

1
Window* pTemp = new Window("Dummy", 20, 20, false, false, false); // Ich habe den Konstruktor um einen Parameter erweitert -> bOwnContext


Ich habe auch schon folgende Lösung probiert (im Konstruktor von 'Window'):

C-/C++-Quelltext

1
2
3
4
static bool bClassRegistered = false;
if(false == bClassRegistered){
    // Klasse registrieren etc.
}


Das führt dann aber dazu, das ich den Error "Cannot find window class." bekomme.
Interessanterweise bekomme ich diesen auch nur dann, wenn ich einen Kontext innerhalb des Konstruktors erstelle.

EDIT:

Folgendes Szenario funktioniert seltsamerweise:

C-/C++-Quelltext

1
2
Window window(...);
Context (window);


Erstelle ich aber den Context innerhalb von Window (Konstruktoraufruf gaaaaaaanz am Ende von Window Konstruktor) dann bekomme ich die Exception vom Titel des Posts.
Dazwischen werden keine weiteren Funktionsaufrufe getätigt.
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Julién« (13.05.2016, 14:23)


Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

16

13.05.2016, 14:30

@Schrosch: Die Symptome sind mein Problem.
Ich sehe sonst kein weiteres als dieses.
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

17

13.05.2016, 14:46

Zitat

Was auch interessant ist, dass ich einen "Class not found" Error bekomme (bzw. irgendwas, das so ähnlich heißt :thumbsup: ),
wenn ich die Klasse nur ein einziges mal im kompletten Ablauf registriere.

Wie gesagt es ist bei mir etwas her dass ich mit der WinAPI rum gespielt habe aber ich kann mich nicht daran erinnern Fensterklassen mehrmals registrieren zu müssen. Das Problem sollst du lösen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

18

13.05.2016, 14:57

Ich habe jetzt folgenden Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        static bool bRegistered = false;
        if(false == bRegistered){
            WNDCLASSEX  wc      = {};
            wc.cbSize           = sizeof(WNDCLASSEX);
            wc.hInstance        = GetModuleHandle(nullptr);
            wc.lpfnWndProc      = internal::WndProc;
            wc.lpszClassName    = pTitle;
            wc.style            = CS_VREDRAW | CS_HREDRAW | CS_OWNDC;

            if(0 == RegisterClassEx(&wc)){
                //
                //  The exception class will contain the error code and
                //  a error discription.
                //
                std::error_code err_code(GetLastError(), std::system_category());
                throw std::system_error(err_code);
            }
            bRegistered = true;
        }


Soweit ich das verstehe, wird der Code in der Klammer nur ein einziges mal ausgeführt, richtig?
Wenn ich WNDCLASSEX nur ein einziges mal erstelle, dann bekomme ich den Error "Cannot find window class."

EDIT:
Folgendes Szenario führt dann zum Fehler:

C-/C++-Quelltext

1
2
Window winA(...);
Window winB(...);
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Julién« (13.05.2016, 15:12)


19

13.05.2016, 15:49

Du müsstest der Klasse noch einen eindeutigen Namen geben.

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

20

13.05.2016, 18:01

Ah, der Teufel liegt natürlich im Detail.
Ich habe total vergessen, dass CreateWindowEx die WNDCLASSEX Instanz über den Namen referenziert. Merci Techel <3

Meine Lösung sieht wie folgt aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        static const char*    pcClassName;
        if(nullptr == pcClassName){
            WNDCLASSEX  wc      = {};
            wc.cbSize           = sizeof(WNDCLASSEX);
            wc.hInstance        = ((HINSTANCE)&__ImageBase);
            wc.lpfnWndProc      = internal::WndProc;
            wc.lpszClassName    = pTitle;
            wc.style            = CS_VREDRAW | CS_HREDRAW | CS_OWNDC;

            if(0 == RegisterClassEx(&wc)){
                //
                //  The exception class will contain the error code and
                //  a error discription.
                //
                std::error_code err_code(GetLastError(), std::system_category());
                throw std::system_error(err_code);
            }
            pcClassName = pTitle;
        }


Was ich nur nicht verstehe ist, weshalb kann ich weitere Instanzen außerhalb des Konstruktors erstellen, ohne dass das Programm sich beschwert?
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Werbeanzeige