Archiv verlassen und diese Seite im Standarddesign anzeigen : (Unendliche) While Schleife
Cartment
25.05.2010, 06:08
Hallo alle miteinander.
Ich habe gestern mit der Programmierung via Wire angefangen
bzw. bin eigentlich nur recht zufällig darauf gestoßen.
Jedoch habe ich nun auch schon ein erstes Verständnis Problem.
if ( (GoUp == 1) & (HoverPower == 1) ) {
HoverSpeed = 1
while ( (Ypos < 500 ) & (HoverPower == 1) ) {}
}
Und zwar mit dieser Schleife.
Mein Ziel ist es vier Hoverballs anzusteueren. Dazu nehme ich mir von einem
die aktuelle zposition und übergebe sie an die Variable Ypos. Diese dient
daraufhin als Orientierungspunkt für die Höhe. Nur meckert er über Schleife
und gibt mir einen Fehler aus.
Infinite Loop Detected!
tick quata exceeded
Ich sollte vielleicht erwähnen das ich bereits größere Erfahrungen in den Programmiersprachen
PHP und C gemacht habe. In C benutze ich derartige Schleifen, für die Ansteuerungen eines
Motors, doch wird mir das ganze nicht schlüßig, wieso das ganze nicht auch bei Gmod funktioniert
Enthält deine Schleife auch noch irgendwelchen Code? Das was du gepostet hast, erzeugt bei einer Ypos von unter 500 offensichtlich eine Endlosschleife. (Die Variable wird ja in der Schleife nicht mehr angerührt, also bleibt die Bedinung für immer erfüllt)
Cartment
25.05.2010, 13:00
Indrekt.
HoverSpeed = 1
Ist die Beschleunigung mit der der Hoverball beschleunigt wird.
Da diese Positiv ist beschleunigt bzw. erhöht Ypos, wodurch
dieser irgendwann unweigerlich größer als 500 wird.
Und deshalb diese Schleife.
1mannlan
25.05.2010, 13:07
Schick einfach mal den Kompletten Code dann kann man sich das bestimmt besser vorstellen.
Cartment
25.05.2010, 13:19
@name Camera Controll
@inputs PowerOn PowerOff PowerShout GoUp Ypos
@outputs HoverPower HoverSpeed
@persist
StartPosition = 0
if ( (PowerOn == 1) & (HoverPower == 0) ) {
StartPosition = Ypos
HoverSpeed = 0
HoverPower = 1
} elseif ( (PowerOff == 1) & (HoverPower == 1) ) {
if ( Ypos > StartPosition ) {
HoverSpeed = -1
} elseif ( Ypos < StartPosition ) {
HoverSpeed = 1
}
while ( (Ypos != StartPosition) & (HoverPower == 1) ) {}
HoverSpeed = 0
HoverPower = 0
} elseif ( PowerShout == 1 ) {
HoverSpeed = 0
HoverPower = 0
}
if ( (GoUp == 1) & (HoverPower == 1) ) {
HoverSpeed = 1
while ( (Ypos < 500 ) & (HoverPower == 1) ) {}
}
Gleich auch mal eine Frage.
Womit deklariere ich tempoare Variablen? (StartPosition)
Hidden Evil
25.05.2010, 13:28
Gleich auch mal eine Frage.
Womit deklariere ich tempoare Variablen? (StartPosition)
@persist StartPosition
Cartment
25.05.2010, 13:30
Danke
Cartment
26.05.2010, 14:43
Weiß denn keiner eine Antwort?
Ich glaube es kann niemand so ganz dein Problem nachvollziehen. Was soll die while Schleife genau bezwecken? Eine leere Schleife bringt doch nichts?
Cartment
26.05.2010, 17:06
Er soll solange in der Schleife bleiben,
bis der Hoverball die gewünschte Position erreicht hat.
Hidden Evil
26.05.2010, 17:44
Da liegt der Denkfehler. Das E2 bleibt solange in der Schleife, bis die Schleifenbedingung erfüllt wird, dabei wird nicht das Äußere der Schleife einbezogen. Ergo, es bleibt eine Endlosschleife, da sich die abgefragte Variable nicht in der Schleife verändert und daher nie die Bedingung erfüllt wird. Und daher tritt der von Dir genannte Fehler
Infinite Loop Detected!
tick quata exceeded
ein.
Cartment
26.05.2010, 18:19
Nur einmal zum Verständnis.
Ypos ist die aktuelle Höhe des Hovers, die sich durch
HoverSpeed = 1 stetig verändert/vergrößert. Dementsprechend
wäre es keine Endlosschleife mehr da der HoverBall ja irgendwann
die Höhe von 500 überschreitet.
1mannlan
26.05.2010, 19:33
Die Sache ist die, er bleibt in der Schleife da sie einfach leer ist. Und da das soviele Ops erzeugen würde bricht es halt ab. Wieso nicht einfach eine If Abfrage? Trifft die nicht zu, durchläuft er eben den ganzen Code von oben nach unten. Dann setzt du eben kurz vor der Schleife eine Variable die alle anderen ausser Kraft setzt [andre enthalten dann z.B. & Disabled != 1)]. Das wäre einfach machbar und erzeugt nicht unnögit ops.
don-banane
28.05.2010, 12:10
Woher soll LUA denn wissen, dass vielleicht irgentwann Höhe 500 erreicht wird?
Warum muss man sich hier "Warum geht x nicht, das muss doch gehen" anhören? Wenn es in deinen Kopf nicht reingeht, dann erfordet es halt Umdenken (oder vielleicht hilft es, die Grundsätze der Programmierung zu lernen).
Innerhalb der While schleife gibt es zumindest nichts, was sie abbrechen könnte, daher wahrscheinlich auch der Fehler. Andere Möglichkeit wäre auch, dass Lua einfach leerlaufende Schleifen aus Performancegründen blockt.
Und wenn es bei E2 einen Sleep Befehl gibt, dann würde ich ihn auf jeden Fall mal für die Schleife ausprobieren.
Powered by vBulletin® Version 4.2.2 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.