Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 24.10.2003, 01:16 Titel: Case-Marken bei Windowsmessages |
|
|
Hi,
ich bekomme die Fehlermeldung "Initialisierung von 'dreieck' durch 'case'-Marke übersprungen", wenn ich ein Objekt dreieck innerhalb der Windowsmessages verwenden will, also wenn es z.B. nur dann erstellt werden soll, wenn die linke Maustaste gedrückt wird oder so.
Ich kann das Programm nur fehlerfrei kompilieren, wenn ich die Anweisungen für WM_LBUTTONDOWN als letzte case Marke hinter allen anderen hinschreibe. Sobald ich eine andere case Marke darunter habe, kommt oben genannte Fehlermeldung.
Kann man das irgendwie hinkriegen, dass noch weitere case Marken fehlerfrei darunter gesetzt werden können oder geht es nicht anders =/
MFG
#C _________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 24.10.2003, 07:40 Titel: |
|
|
Puh schwer zu sagen ich würd mal tippen das du deine Marken nicht definiert hast (die Marke dreieck ohne zu initialisieren verwendest) oder das du ein break vergessen hast.
Zeig doch mal deine Switch Anweisung zum besseren Verständniss. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 24.10.2003, 08:22 Titel: |
|
|
Du darfst in einer case Anweisung kein Objekt direkt zuweisen:
Code: |
int i = 1; // Compiler meckert
int i;
i = 1; // okay
|
C. |
|
Nach oben |
|
|
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 24.10.2003, 11:32 Titel: |
|
|
kann man nicht einfach die initialisierung in einen block schreiben?:
Code: |
case XYZ:
{
int x = 1;
}
|
|
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 24.10.2003, 13:47 Titel: |
|
|
Du kannst die Variable auch einfach vor dem switch-Ausdruck initialisieren:
Code: | CALLBACK...wasauchimmer
{
int i=0;
switch(msg)
{
case irgendwas:
}
} |
_________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 24.10.2003, 16:57 Titel: |
|
|
Der Tipp von Christian funktioniert. Danke dafür =)
Ich hatte zudem noch vor, dass per Druck auf Pfeiltaste-Oben die Länge der Grundseite des Dreiecks (m_size) um 10 Pixel verlängert wird.
Dazu habe ich folgendes geschrieben:
Code: |
case WM_KEYDOWN:
{
case VK_UP:
dreieck->setSize(dreieck->getSize()+10);
break;
case VK_DOWN:
if(dreieck->getSize()-10 > 0)
dreieck->setSize(dreieck->getSize()-10);
break;
}
return 0;
break;
|
Jedoch lässt ein Effekt auf sich warten
dreieck wurde vor der switch-Anweisung deklariert und mittels Konstruktor wurden die Membervariablen auf 0 gesetzt.
Die Werte werden bei WM_LBUTTONDOWN festgelegt, also x/y Koordinate und die Anfangsgröße.
Liegt der Fehler möglicherweise bei WM_KEYDOWN? _________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 24.10.2003, 22:38 Titel: |
|
|
Verstehe ich das richtig, du legst das Dreieck auch in der Funktion an? Und wo zeichnest du es?
C. |
|
Nach oben |
|
|
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 25.10.2003, 02:40 Titel: |
|
|
Also gezeichnet wird es unter WM_LBUTTONDOWN mit der Methode dreieck->drawD(HDC hdc).
Angelegt habe ich es hier:
Code: |
LRESULT CALLBACK usw.
{
HDC hdc;
Dreieck* dreieck = new Dreieck(); // Konstruktor setzt alles auf 0
dreieck->setSize(30); // Startgröße setzen
switch(msg)
{
....
} |
_________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 25.10.2003, 08:19 Titel: |
|
|
Zyrian hat Folgendes geschrieben: | Der Tipp von Christian funktioniert. Danke dafür =)
Ich hatte zudem noch vor, dass per Druck auf Pfeiltaste-Oben die Länge der Grundseite des Dreiecks (m_size) um 10 Pixel verlängert wird.
Dazu habe ich folgendes geschrieben:
Code: |
case WM_KEYDOWN:
{
case VK_UP:
dreieck->setSize(dreieck->getSize()+10);
break;
case VK_DOWN:
if(dreieck->getSize()-10 > 0)
dreieck->setSize(dreieck->getSize()-10);
break;
}
return 0;
break;
|
Jedoch lässt ein Effekt auf sich warten :cry:
dreieck wurde vor der switch-Anweisung deklariert und mittels Konstruktor wurden die Membervariablen auf 0 gesetzt.
Die Werte werden bei WM_LBUTTONDOWN festgelegt, also x/y Koordinate und die Anfangsgröße.
Liegt der Fehler möglicherweise bei WM_KEYDOWN? |
Das ist klar, dass das nicht Funktioniert. Du musst in dem case-Zweig noch eine switch-Anweisung bauen, und zwar musst du wParam testen. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 25.10.2003, 16:15 Titel: |
|
|
Ahjo, stimmt ja. Naja, sind eben die typischen Anfängerfehler
Also so:
Code: |
case WM_KEYDOWN:
switch(wParam)
{
case VK_UP:
dreieck->setSize(dreieck->getSize()+10);
break;
case VK_DOWN:
if(dreieck->getSize()-10 > 0)
dreieck->setSize(dreieck->getSize()-10);
break;
}
return 0;
break;
|
Klappt aber trotzdem nicht
Das Dreieck behält seine ursprüngliche Grundseitenlänge von 30 Pixeln. _________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 25.10.2003, 19:49 Titel: |
|
|
Du musst schon das Dreieck ändern, dass du auch zeichnest, wenn du in der Funktion immer wieder ein neues Dreieck erstellst, wird das kaum gehen.
C. |
|
Nach oben |
|
|
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 26.10.2003, 02:01 Titel: |
|
|
Juhuu, es funktioniert ^^
Lag tatsächlich daran, dass das Dreieck immer wieder neu in der CALLBACK Funktion deklariert wird. Genauso war die Anweisung dreieck->setSize(30); am falschen Platz.
Folglich war mein konkreter Denkfehler, dass ich verpeilt habe, dass die gesamte CALLBACK Funktion immer wieder durchläuft. Anscheinend hab ich angenommen, dass nur die switch-Schleife immer wieder durchläuft (wie kommt man nur auf solche Ideen...?).
Also, danke für die Hilfe =)
MFG
#C _________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
|
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 26.10.2003, 02:38 Titel: |
|
|
Ein Nachtrag noch:
Laut MSDN lassen sich Tastendrücke von normalen Buchstabentasten mittels VK_A bis VK_Z abrufen. Wieso sagt mein Compiler, dass er diese Befehle nicht kennt? Alle anderen Tasten wie die F-Tasten lassen sich prüfen aber nicht die Buchstaben... _________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 26.10.2003, 07:57 Titel: |
|
|
Sind (glaub ich) in winuser.h definiert. |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 26.10.2003, 11:32 Titel: |
|
|
Wenn man Windows.h includiert, sollte Winuser.h automatisch ebenfalls (durch windows.h) includiert sein. _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
|