Armed-Assault.de Twitter
Antwort
 
Themen-Optionen Ansicht
Alt 11.05.2012, 21:29   #1 (permalink)
Newbie
 
Registriert seit: 26.12.2008
Beiträge: 25
Standard If-Condition in While-Schleife

Hallo

Ich bin hier grade ziemlich am verzweifeln, zumal ich beim besten Willen einfach nicht herausfinden kann, was ArmA an dem Script grade nicht passt.


Code:
hint "init.sqf is working...";
sleep 3;
_zahl = 0;
hint format ["Zahl: %1", _zahl];
while {true} do {
    _zahl = _zahl + 1;
    hint format ["Zahl: %1", _zahl];
    sleep 1;
    if (_zahl >= 25) then {
        exitWith{}
        };
};
hint "Exited Loop :D";
sleep 2;
hint "";

Meiner Meinung nach sollte mit dem Script ein Timer bis 25 zählen, und dann die While-Schleife verlassen. So wie ich das sehe is die Syntax auch korrekt.

Aber anscheinend is er irgendwie nicht zufrieden mit der If-Abfrage in der While-Schleife.

Das Script läuft dann zwar, allerdings wird die While-Schleife nie ausgeführt, d.h. Zahl: 1, Zahl: 2 etc bekomme ich einfach garnicht zusehen...

Ich weiß, dass ich die Bedingung zum verlassen auch gleich in die While-Bedingung schreiben könnte, aber mir gehts hier eben explizit darum, die Schleife mit exitWith{} zu verlassen.

Ne Idee warum das oben nicht geht?

lg
123justin321 ist offline   Mit Zitat antworten
Alt 11.05.2012, 22:31   #2 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Buliwyf
 
Registriert seit: 11.03.2005
Ort: HH
Alter: 46
Beiträge: 1.927
Standard

Code:
if (_zahl >= 25) exitWith {};
...so lautet die Syntax korrekt.

Ich bezweifel allerdings, dass damit Deine WHILE Schleife damit beendet wird. Um das zu bewerkstelligen solltest Du Dir das hier anschauen...

__________________
Buliwyf ist offline   Mit Zitat antworten
Alt 11.05.2012, 22:34   #3 (permalink)
Newbie
 
Registriert seit: 26.12.2008
Beiträge: 25
Standard

Danke erstmal

Ist meine if-Abfrage denn wirklich falsch?

Immerhin wird sie in der BISTUDIO-Wiki ebenfalls folgendermaßen aufgeführt:
Code:
if (CONDITION) then {
       STATEMENT; 
       ... 
};
Zumal die von dir aufgeführte Variante doch auch nur maximal ein Statement erlaubt, oder sehe ich das falsch?

lg
123justin321 ist offline   Mit Zitat antworten
Alt 11.05.2012, 23:01   #4 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von Lester
 
Registriert seit: 26.11.2006
Ort: Kiel, S-H
Alter: 50
Beiträge: 3.010
Standard

Es gibt nach den if entweder nen then oder ein exitwith.
__________________
Nur ein Beispiel das zeigt wie BI "support" definiert: https://feedback.bistudio.com/T75547
Lester ist offline   Mit Zitat antworten
Alt 12.05.2012, 03:32   #5 (permalink)
50 Beiträge100 Beiträge
 
Registriert seit: 29.07.2008
Ort: Wien
Alter: 42
Beiträge: 189
Ghost_Aut eine Nachricht über MSN schicken
Standard

Hello:
Ein Beispiel!
Code:
private ["_zahl"];
 
_zahl = 0;
 
while {_zahl <= 24} do {
    _zahl=_zahl + 1;
    hint format ["Zahl: %1", _zahl];
    sleep 1;
};
 
if (_zahl >= 25) exitWith {hintc "Script Akt. zeile"};
 
if (true) exitWith {};
__________________
Ghost_AUT
Ghost_Aut ist offline   Mit Zitat antworten
Alt 12.05.2012, 07:24   #6 (permalink)
Newbie
 
Registriert seit: 26.12.2008
Beiträge: 25
Standard

Oh, entweder oder.^^ Okay, dann ist das natürlich klar.

Vielen Dank euch allen.

Lg
123justin321 ist offline   Mit Zitat antworten
Alt 18.05.2012, 22:45   #7 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von xezon
 
Registriert seit: 31.03.2003
Beiträge: 2.533
Standard

exitWith, wer lässt sich so einen schwachsinn einfallen
Hallo Lester, schöne Grüße!
xezon ist offline   Mit Zitat antworten
Alt 18.05.2012, 23:14   #8 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von Lester
 
Registriert seit: 26.11.2006
Ort: Kiel, S-H
Alter: 50
Beiträge: 3.010
Standard

Zitat von xezon Beitrag anzeigen

exitWith, wer lässt sich so einen schwachsinn einfallen
Hallo Lester, schöne Grüße!

Grüße zurück

Exitwith ist sehr nützlich weil es nämlich nur den aktuellen Loop abbricht, erst auf der untersten Ebene des Scripts wird es gezielt das Script beenden und das eben mit den nachfolgenden Scriptteilen.

PHP-Code:
if (!isserverexitwith {hint "Nicht der Server";};
... 
__________________
Nur ein Beispiel das zeigt wie BI "support" definiert: https://feedback.bistudio.com/T75547
Lester ist offline   Mit Zitat antworten
Alt 19.05.2012, 10:27   #9 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

Zitat von xezon Beitrag anzeigen

exitWith, wer lässt sich so einen schwachsinn einfallen

So angewendet: if (true) exitWith {} darf man dem beipflichten.

Am Skriptende überflüssig und wenn man einen Teil des Skripts bis zum Skriptende ausschließen will ist es übersichtlicher den Teil auf "Kommentar zu setzen": /*
Vienna ist offline   Mit Zitat antworten
Alt 19.05.2012, 12:27   #10 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von xezon
 
Registriert seit: 31.03.2003
Beiträge: 2.533
Standard

was passiert wenn am ende des skripts kein exitWith steht?
xezon ist offline   Mit Zitat antworten
Alt 19.05.2012, 13:48   #11 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Buliwyf
 
Registriert seit: 11.03.2005
Ort: HH
Alter: 46
Beiträge: 1.927
Standard

Zitat von xezon Beitrag anzeigen

was passiert wenn am ende des skripts kein exitWith steht?

...das Script endet.
__________________
Buliwyf ist offline   Mit Zitat antworten
Alt 19.05.2012, 14:43   #12 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von xezon
 
Registriert seit: 31.03.2003
Beiträge: 2.533
Standard

Also wenn ich das richtig verstanden habe ist das Ding nix anderes als

Code:
while(x)
{
// ...
if(y) { z=true; break; }
}
c++
xezon ist offline   Mit Zitat antworten
Alt 19.05.2012, 15:05   #13 (permalink)
500 Beiträge1000 Beiträge
 
Benutzerbild von Pfandgiraffe
 
Registriert seit: 16.09.2008
Ort: Berlin
Alter: 31
Beiträge: 1.724
Pfandgiraffe eine Nachricht über ICQ schicken Pfandgiraffe eine Nachricht über Skype™ schicken
Standard

Code:
 
y = false
z = 0
#loop
~0.1
z = z + 1
?(z>3) : y = true
?(y) : goto "raushier"
goto "loop"
#raushier
exit
... ja sowas eben.
*wenn man das sieht wird einem ganz schlecht!*


Grüße
__________________
Niemand hat die Absicht eine Tüte zu bauen!
Pfandgiraffe ist offline   Mit Zitat antworten
Alt 19.05.2012, 15:54   #14 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von xezon
 
Registriert seit: 31.03.2003
Beiträge: 2.533
Standard

Zitat von Psychobastard Beitrag anzeigen

Code:
 
y = false
z = 0
#loop
~0.1
z = z + 1
?(z>3) : y = true
?(y) : goto "raushier"
goto "loop"
#raushier
exit
... ja sowas eben.
*wenn man das sieht wird einem ganz schlecht!*


Grüße
raushier
xezon ist offline   Mit Zitat antworten
Alt 20.05.2012, 01:56   #15 (permalink)
50 Beiträge100 Beiträge
 
Registriert seit: 29.07.2008
Ort: Wien
Alter: 42
Beiträge: 189
Ghost_Aut eine Nachricht über MSN schicken
Standard

Ja natürlich gibt’s auch andere Möglichkeiten war ja in Grunde auch nur ein Beispiel von mir, aber bevor der eine oder andere, hier nur sinnlosen Sachen postet, und es in grunde kein Facebook hier ist könntet ihr ja auch einen code posten!

Ich stelle das If (true) exitWith {}; am Schluss, des scripts, da ich mir sicherer bin, wenn ich es öfter aufrufe das es auch richtig beendet wird!
(Das bleibt in grunde wohl jeden selbst überlassen!) soll aber jetzt nicht böse gemeind sein!
__________________
Ghost_AUT

Geändert von Ghost_Aut (20.05.2012 um 02:04 Uhr).
Ghost_Aut ist offline   Mit Zitat antworten
Alt 20.05.2012, 02:08   #16 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von xezon
 
Registriert seit: 31.03.2003
Beiträge: 2.533
Standard

Naja aber wir haben ja grad gelernt dass das exitWith ein break aus einem scope is. Dein if da unten ist in keinem scope mehr, daher ist es sinnfrei dort zu versuchen rauszuspringen.

Meckert die Engine nicht wenn sowas ausgeführt wird?
xezon ist offline   Mit Zitat antworten
Alt 20.05.2012, 02:26   #17 (permalink)
50 Beiträge100 Beiträge
 
Registriert seit: 29.07.2008
Ort: Wien
Alter: 42
Beiträge: 189
Ghost_Aut eine Nachricht über MSN schicken
Standard

Bei diesen Beispiel ist es sinnlos ist schon richtig da
Code:
if (_zahl >= 25) exitWith {hintc "Script Akt. zeile"};

Schon diese Zeile am Schluss reicht!

Wenn:
Code:
 If (_zahl >= 25) then {hintc "Script Akt. zeile"};
Code:
//Dann wer diese Zeile sinnvoller! 
If (true) exitWith {};


Aber war auch in Endeffekt mal schnell hier rein geschrieben, der obere code!
__________________
Ghost_AUT

Geändert von Ghost_Aut (20.05.2012 um 02:30 Uhr).
Ghost_Aut ist offline   Mit Zitat antworten
Alt 20.05.2012, 02:39   #18 (permalink)
50 Beiträge100 Beiträge
 
Registriert seit: 29.07.2008
Ort: Wien
Alter: 42
Beiträge: 189
Ghost_Aut eine Nachricht über MSN schicken
Standard

Also in Großen und ganzen meine ich es so!
Code:
private ["_zahl"];
 
_zahl = 0;
 
while {_zahl <= 24} do {
    _zahl=_zahl + 1;
    hint format ["Zahl: %1", _zahl];
    sleep 1;
};
 
if (_zahl >= 25) exitWith {hint "script code};
oder
Code:
private ["_zahl"];
 
_zahl = 0;
 
while {_zahl <= 24} do {
    _zahl=_zahl + 1;
    hint format ["Zahl: %1", _zahl];
    sleep 1;
};
 
if (_zahl >= 25) then {hint "scripr code};
if (true) exitWith {};
__________________
Ghost_AUT
Ghost_Aut ist offline   Mit Zitat antworten
Alt 20.05.2012, 11:29   #19 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von xezon
 
Registriert seit: 31.03.2003
Beiträge: 2.533
Standard

Deine Verwendung da unten is falsch. Möglicherweise macht sich die Engine nichts draus, aber das macht den Fehler nicht minder.

Ich erklärs nochmal kurz: es gibt schleifen² und das switch³ und diese haben ein sogenanntes scope indem du den code einschließt der ausgefühlt werden soll wenn die Eingangsbedingung wahr ist. Es gibt nun 2 möglichkeiten dieses scope zu verlassen:
  • Die Bedingung der Schleife ist falsch
  • Das Scope wird durch einen Jump verlassen
Den Jump erstellt der compiler in Arma 2 durch keywords alá breakOut, breakTo, exitWith. Ein break macht nur dort sinn, wo du einen scope verlassen möchtest.

Anmerkung:
² count und forEach sind auch schleifen wenn ich das richtig sehe
³ switch is equivalent zu if + else if verkettetem statement

Ich hoffe ich konnte helfen
xezon ist offline   Mit Zitat antworten
Alt 20.05.2012, 16:48   #20 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

Zitat von Ghost_Aut Beitrag anzeigen

Ich stelle das If (true) exitWith {}; am Schluss, des scripts, da ich mir sicherer bin, wenn ich es öfter aufrufe das es auch richtig beendet wird!

Woran erkennt man durch diese Zeile ob ein Skript richtig beendet wurde?

Wenn du beim Testen wissen willst ob ein Skript beendet wurde, dann reicht doch als letzte Zeile eine Textausgabe wie z.B.
hint "Skript ende!"
ohne Strichpunkt am Zeilenende.
Vienna ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Kontakt - HX3.de - Archiv - Nach oben

Angetrieben durch vBulletin, Entwicklung von Philipp Dörner & Tobias



SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116