[C++] Suche Fehler im Code

V1tzl1

Lt. Junior Grade
Registriert
Sep. 2004
Beiträge
384
Hi leutz, stehe leider gerade etwas auf dem Schlauch.
Mein Compiler gibt mir bei folgendem Code einen Fehler.
Code:
void draw(int x, int y, int art)
 {
  int x1, x2, y1, y2;
  x1 = (x  )*FAKTOR+PADDING;
  x2 = (x+1)*FAKTOR+PADDING;
  y1 = (y  )*FAKTOR+PADDING;
  y2 = (y+1)*FAKTOR+PADDING;
  switch(art)
   {
    case 0:
      HPEN    pen   = CreatePen(PS_SOLID,1,RGB(255,0,0));
      HBRUSH  brush = CreateSolidBrush(RGB(255,0,0));
      SelectObject(hdc, pen);
      SelectObject(hdc, brush);
      Rectangle(hdc, x1, y1, x2, y2);
      break;
    case 1:  // Hier bleibt der Compiler stehen
      HPEN    pen   = CreatePen(PS_SOLID,1,RGB(0,255,0));
      HBRUSH  brush = CreateSolidBrush(RGB(0,255,0));
      SelectObject(hdc, pen);
      SelectObject(hdc, brush);
      Rectangle(hdc, x1, y1, x2, y2);
      break;
    case 2:
      HPEN    pen   = CreatePen(PS_SOLID,1,RGB(0,0,255));
      HBRUSH  brush = CreateSolidBrush(RGB(0,0,255));
      SelectObject(hdc, pen);
      SelectObject(hdc, brush);
      Rectangle(hdc, x1, y1, x2, y2);
      break;
    case 3:
      HPEN   pen   = CreatePen(PS_SOLID,1,RGB(0,0,255));
      HBRUSH brush = CreateSolidBrush(RGB(0,0,255));
      SelectObject(hdc, pen);
      SelectObject(hdc, brush);
      Rectangle(hdc, x1, y1, x2, y2); 
      pen   = CreatePen(PS_SOLID,1,RGB(255,255,0));
      brush = CreateSolidBrush(RGB(255,255,0));
      SelectObject(hdc, pen);
      SelectObject(hdc, brush);
      Ellipse(hdc, x1+2, y1+2, x2-2, y2-2);   
      break;
   }
 }
Ich hoffe ihr könnt mir helfen.
 
wär natürlich schön gewesen, wenn du den Fehler auch noch dazugeschrieben hättest, aber ich vermute mal folgendes:
Compiler meckert, weil da Variablem im case deklariert werden, also bauste das entweder davor oder packst jeden case in {}
 
Jo es war die Var Definition.
Vielen Dank.

BTW Wie kann ich bei DevC++ den Compilerfehler sehen.
Bei mir hört er nur auf zu compilieren und springt zu der fehlerhaften Zeile
 
das problem ist das du in jedem case element die selben variablen neu anlegst. die case elemente haben aber keinen eigenen stack(da man die ja auch ohne break; benutzen könnte) - daher der fehler.

am einfachsten also in jeden case einen neuen block anlegen.

das sieht dann etwa so aus:
Code:
case !?!:
      {
            ....dein code......
      }
      break;
 
Danke für deine Hilfe Husky, aber das hatte dein Vorredner ja schon gesagt und es funktioniert bereits.
Was ich jetz noch wissen möchte ist, wie ich die Compilerfehler in DevC++ sehen kann.
Wenn bei DevC++ ein Compilerfehler ist, schließt er einfach das Compilerfenster und springt im Editorfenster zur betroffenen Stelle. Desshalb konnte ich am anfang auch keine Fehlermeldung mit geben, bzw hätte es anhand der Fehlermeldung warscheinlich selbst gemerkt.
Trotzdem Danke für eure bisherige Hilfe
 
Kennt jemand ein Tutorial über so nen Kram ?
Währe nett :D

Also ich mein jetzt Rechtecke und andere geometrische Formen auf den Bildschirm zaubern.
 
Z.B. http://nehe.gamedev.net/

Ist zwar für OpenGL und damit vielleicht ein etwas grosser Schritt, ich fand es aber interessant.

Um mit dem Win32 API geometrische Formen zu zeichnen, sollte imho eigentlich die Online Hilfe ausreichen.

@V1tzl1,

was in Deinem Code noch fehlt ist die Restaurierung der geänderten Parameter des dc.
D.h. wenn Du einen PEN in einen DC selektierst, überschreibts Du damit schliesslich den vorher gültigen Pen.

HPEN lNewPen = ...
HPEN loldPen = SelectObject( hdc, lNewPen );

...

SelectObject( hdc, lOldPen );

Bei Pens ist das vielleicht nocht nicht schlimm, wenn Du vor dem Zeichnen immer den gewünschten Pen neu setzt.
Spätestens bei Bitmaps wird es aber wichtig ob ein Objekt nocht selektiert ist oder nicht.


MfG

Arnd
 
Zuletzt bearbeitet:
Hi hätte jetz gedacht, das das egal ist, da ich ja in jeder Funktion einen anderen Pen brauche, aber wenn du sagst, dass es für Bitmaps wichtig wird, werde ich das gleich mit reinzaubern, da die kacheln ja eh ur platzhalter für bitmaps sind.
Also vielen Dank
 
Ne OpenGl ist nicht das richtige. Arbeite eher mit DirectX. Trotzdem danke.
 
Hallo V1tzl1,

wie bereits gesagt, funktional gesehen kann man das schon weglassen. Die daraus entstehenden Seiteneffekte sind alle beherrschbar.
Aber der Code ist einfach konsistenter und wartungsarmer wenn er hinter sich aufräumt.

Wenn Du jetzt aber z.b. im Ereignishandler eines Controls die Background oder Textfarbe änderst werden die folgenden Zeichenoperationen in der neuen Farbe erfolgen. D.h. der Text in einem Staticfeld ist plötzlich nicht mehr schwarz sondern z.B. rot.

Bzgl. Bitmaps bevor eine Bitmap deleted wird darf sie nicht mehr in einen DC selektiert sein.

MfG

Arnd
 
Ok werd mich drum kümmern, danke
 
Zurück
Oben