Stack overflow??



  • tut mir leid, aber ne andere idee hab ich nich...aber überprüf doch einfach, ob die xposition des blocks < 0 ist und wenn dies so ist setze sie manuell auf 0. und wenn die xposition+breite größer als die breite des spielfeldes ist, setze die xposition auf spielfeldbreite-breitedeskästchens. (oder so *gg*)
    das sollte zumindest verhindern das es übern rand hinausschießt...


  • Mod

    Tetris-Fan schrieb:

    ich könnte den loop ja auch so lassen, wie ich es zuerst geschrieben hab, aber wie mache ich es dann, dass der stein nicht über den rand "schreitet".

    das einfachste wäre, wenn du dein spielfeld links und rechts breiter machst, und falls du den block dann in einen ungültigen bereich schiebst oder rotierst, dann machst du den zug rückgängig. (natürlich solltest du die außenkanten nicht anzeigen!)

    wenn sich dein programm aufhängt, dann könnte das durch eine endlosschleife oder endlos rekursion passieren, wenn dir das devstudio nach dem ausschaulten des programms eine position anzeigt, könnte es sein, dass sie nicht mehr stimmt, weil das programm schon vorher fehler hatte und ein paar pointer nicht stimmen.
    schau dir also an wo du rekursionen hast und ob die wirklich abbrechen.
    lass den code im debugger laufen und halt ihn einfach an wenn das spiel blockiert, dann könntest du mit hocher wahrscheinlichkeit dort landen, wo der fehler auftritt.

    rapso->greets();



  • tja, aber wenn ich da anhalten will, wo es blockiert ist es meistens schon zu spät, denn meistens hängt sich der gesamte pc auf... rekursion benutze ich nciht und endlosschleifden auch nicht...
    wenn ich einfach BlockX prüfe, gibt es ungenauigkeiten, denn Blockj X steht fgür die "position" des array eintrags [0][0] des block arrays. bei einem stein wie im ersten beitrag (der lange) wäre das problem, dass er schon stoppen würde, wenn der "eigentliche" stein den rand noch gar nichtr berühren würde... deshalb auch der ganze schmarrn mit MinX und so...
    ich versuche noch mal was und poste dann, ob es geklappt hat, trotzdem bin ich für weitere lösungen offen.
    bis später



  • @tetris-fan
    Ich glaube auch, dass es am iMinX + m_iBlockX = -1 liegt.
    Probier es mal so:

    ...
    if (iMinX + m_iBlockX < 0) 
    { 
        bCollide = mrTrue; 
    } 
    else
    {
       if (m_aiArena[iY + m_iBlockY][iMinX + m_iBlockX] != 0) 
       { 
          bCollide = mrTrue; 
       }
    }
    ...
    

    Wobei ich noch einen besseren Vorschlag hätte:

    ...
    if (iMinX + m_iBlockX < 0) 
    { 
       return; //Warum unnötig weiterrechnen, wenn eh schon feststeht, dass der Block nicht weiter kann?
    } 
    if (m_aiArena[iY + m_iBlockY][iMinX + m_iBlockX] != 0) 
    { 
       return; 
    }
    ...
    

    😃



  • auch wahr... aaaaaaaaaber... ICH HABS GELÖST 🙂 Juchu
    ich schäme mich beinahe, aber: da sowohl iMinX, als auch m_iBlockX !!unsigned!! long variablen sind........... *ganzdollschäm* können sie natürlich beide nicht klei er als 0 sein... *nochmalschäm* warum sich das programm bei der rückwärts zählenden schleife aufhängt weiß ich zwar immer noch nicht, aber es läuft jetzt so, wie ich es will.
    danke an alle und sorry für eine so dumme frage (bzw. meine schusseligkeit...)
    *undnochmalschämweilessoschöönwar*
    cya 🙂



  • Tetris-Fan schrieb:

    da sowohl iMinX, als auch m_iBlockX !!unsigned!! long variablen sind........... *ganzdollschäm* können sie natürlich beide nicht klei er als 0 sein...

    Warnt da dein Compiler nicht?



  • also bei mir nicht, wieso? ich kann doch testen, ob ne unsigned int variable kleiner als nullk ist, oder? das wäre doch genauso, als ob ich schreibe if (false)... naja, hauptsache, das prob iwt wech... JUCHU 🙂



  • Der Grund, warum die Rückwärts-Zählende-Schleife nicht funktioniert, ist, dass du hier auch wieder das Problem hast, dass die Variable keine negativen Zahlen aufnehmen kann.

    Hat die Schleife so lange runtergezählt, bis die Variable 0 ist, ist die Schleife nicht zu Ende, da die Abbruchbedingung besagt, dass die Variable KLEINER als 0 sein muss. Wird jetzt die Variable weiter erniedrigt, enthält sie die größt mögliche Zahl (z.B. 4.294.967.295 bei int, da keine negativen Zahlen gespeichert werden können), welche immernoch größer als 0 ist. Folglich wird die Schleife nie beendet.


  • Mod

    das hat er doch schon geschrieben

    rapso->greets();



  • Tetris-Fan schrieb:

    ich kann doch testen, ob ne unsigned int variable kleiner als nullk ist, oder?

    Deshalb hab ichs nochmal gesagt. War mir nicht ganz sicher, wie es gemeint war.



  • Tetris-Fan schrieb:

    warum sich das programm bei der rückwärts zählenden schleife aufhängt weiß ich zwar immer noch nicht, [...]

    Und deshalb auch.
    (Ich sollte mich registrieren, damit ich nicht jedesmal nen neuen Beitrag machen muss...)



  • 2Kmm schrieb:

    (Ich sollte mich registrieren, damit ich nicht jedesmal nen neuen Beitrag machen muss...)

    NEIN! Tu's nicht!! 😮

    MICH haben sie auch schon rumgekriegt...!!! 🤡


Anmelden zum Antworten