Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

C/C++ Problem...

wlaner / 6 Antworten / Baumansicht Nickles

Hi,
also es geht um eine ganz normale if-else-Schleife,
allerdings muss es einen Fehler geben, weil das ganze nicht
so funktioniert wie ich will.

Der Code:

int yBallMoveFunc(int iActY)
{
    bool bMoveDown = TRUE;
      if(iActY >= rect.bottom)
      {
       iActY     = rect.bottom-1;
       bMoveDown = FALSE;
      }
      else
      {
       if(bMoveDown = FALSE)
       {iActY--;}
       else
       {iActY++;}
      }
    return iActY;
}


Das Problem:
Mit der Funktion wird die Y-Koordinate eines Kreises bestimmt,
die von einem Timer immer wieder erneuert wird.
Alles funktioniert wie geplant, bis bMoveDown gebraucht wird.
Ich denke es liegt an einer falschen Verschachtelung oder
an bMoveDown.
Der Ball sollte eigentlich beim berühren des unteren Randes wieder nach oben. Das macht er auch, aber dann gehts wieder runter, und wieder hoch, und runter, ...

Das kompilierte Programm
Der ganze Quellcode


Hoffe da kann mir jemand weiterhelfen.
Vielen Dank und frohes Fest ,-))

WLaner

bei Antwort benachrichtigen
mr.escape wlaner „C/C++ Problem...“
Optionen

Die zeile
if(bMoveDown = FALSE)
sieht verdächtig aus. In der klammer befindet sich ein zuweisung ("="), obwohl wahrsch. ein vergleich ("==") gemeint ist.

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Borlander mr.escape „Die zeile if bMoveDown FALSE sieht verdächtig aus. In der klammer befindet sich...“
Optionen

Wobei das selbst mit == noch seltsam wäre, da diese Bedingung nie eintreffen kann (oben wirds auf TRUE gesetzt), daher würde es dann stattdessen immer der Else-Zweig werden...

Gruß
Borlanderq

bei Antwort benachrichtigen
mr.escape Borlander „Wobei das selbst mit noch seltsam wäre, da diese Bedingung nie eintreffen kann...“
Optionen
Wobei ...
Richtig, habe es nur sehr oberflächlich überflogen.

Solange "bMoveDown" nicht zu einer globalen oder wenigstens einer static variable gemacht wird, ist das rel. sinnfrei.

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Borlander mr.escape „ Richtig, habe es nur sehr oberflächlich überflogen. Solange bMoveDown nicht...“
Optionen
Solange "bMoveDown" nicht zu einer globalen oder wenigstens einer static variable gemacht wird, ist das rel. sinnfrei.
Nicht umbedingt. Wenn wir den Else-Zweig des äußeren IF-Konstrukts weglassen, und dessen Inhalt hinter die das erste If setzen dann sollte es das tun was es tun soll (unter der Vorraussetzung daß ich um diese Uhrzeit noch einen hinreichend klaren Verstand habe):
bool bMoveDown = TRUE;
if(iActY >= rect.bottom)
{
iActY = rect.bottom-1;
bMoveDown = FALSE;
}
// weg mit else {
if(bMoveDown == FALSE)
{iActY--;}
else
{iActY++;}
// weg mit }
return iActY;


Btw: Den letzten Block könnte man auch kürzer schreiben als:!bMoveDown ? iActY-- : iAchY++;bzw. bMoveDown ? iActY++ : iAchY--; oder alternativ für ganz schreibfaule auch (wobei ich diese Version am schönsten finde, da die Variable nur einmal auftaucht, sowie anschließend die Verschiebung):iAchY += bMoveDown ? 1 : -1; ;-)


Gruß
Borlander
bei Antwort benachrichtigen
Borlander Nachtrag zu: „ Nicht umbedingt. Wenn wir den Else-Zweig des äußeren IF-Konstrukts weglassen,...“
Optionen

Irgendwie hatte mich gerade noch ein bisschen das Bastelfieber gepackt. Vor allem soll die Kugel ja auch oben nicht rausfliegen ;-) Und weil man den Computer doch nicht unnütz mit Arbeit belasten möchte hier eine Version die mit gerade mal zwei Vergleichen auskommt:
if(bMoveDown) {
  iActY++;
  if(iActY >= rect.bottom) {
    bMoveDown = FALSE;
    iAchY = rect.buttom-2;
  }
}
else {
  iActY--;
  if(iActY     bMoveDown = TRUE;
    iAchY = rect.top+1;
  }
}


Gruß
Borlander

bei Antwort benachrichtigen
wlaner Borlander „Irgendwie hatte mich gerade noch ein bisschen das Bastelfieber gepackt. Vor...“
Optionen

Also da kann ich mich bei euch beiden nur bedanken.
Nachdem dem static machen von bMoveDown (danke mr.escape) und dem Code von Borlander hats auch geklappt :-)

Zu dem Tipp für Schreibfaule: Daran müsste ich mich erst gewöhnen...mir ists so lieber, da kann
ich den Code besser lesen ,-)

Schön dass das so schnell ging.

Also noch schöne Feiertage und nen guten Rutsch

WL


Edit:
So jetzt fliegt die Kugel gar nicht mehr raus :-)

bei Antwort benachrichtigen