HX3 Foren

HX3 Foren (https://hx3.de/)
-   Editing & Scripting (https://hx3.de/editing-scripting-187/)
-   -   warum, wieso, weshalb der Fehler? (https://hx3.de/editing-scripting-187/fehler-22319/)

Tarsius 09.03.2013 14:10

warum, wieso, weshalb der Fehler?
 
Ich will ein Zielobjekt an eine Position verschieben lassen, welche durch einen RANDOM-WERT und IF/THEN/ELSE ermittelt wird.

Der RANDOM-Wert wird ordentlich erzeugt. Doch springt er immer ins erste IF. Selbst wenn der Random-Wert größer als "1" ist. Auch wenn ich zb. statt "<" ein "==" nutze, geht er ins ins erste IF.

WARUM? :nachdenklich:

http://www.imgbox.de/users/Tarsius/arma2_error12.jpg

burns 09.03.2013 14:25

Hatten wir erst kürzlich, Random erzeugt Gleitkommazahlen, die Chance das 1,2 oder 3 rauskommt folglich eher gering. Da darfst du dann mit floor oder ceil rumtricksen: http://community.bistudio.com/wiki/Math_Commands


edit: Ah, das stand ja sogar in deinem Bild das da keine grade Zahl rauskam :ugly:

Tarsius 09.03.2013 15:51

Wie jetzt? Die scrip-sprache kann keine "ganze Zahl" mit einer "reellen Zahlen vergleichen"? Wie gesagt geht es mir ja nicht darum einen "==" Vergleich machen. Sondern lediglich zu ermitteln das zb. "2.45218" nicht kleiner "1" ist. oO

Ergo müsste es helfen "_start = floor _start;" drunter zu klatschen, und dann mit "==" prüfe?

EDIT: Ich ging davon aus, das es eh nur "number" als Zahlentyp gibt. Wird wirklich wie in C zwischen int, float, double und co. differenziert?

Rettich 09.03.2013 15:57

Die random- Geschichten mach ich immer so...

start= 999;
if (isServer) then {
start = round random 3;
publicVariable "start";
}
else {
waitUntil {start != 999};
};

//start= 0;

switch (start) do {
case 0: { Marken_1 setpos getpos SP1; };
case 1: { Marken_1 setpos getpos SP2; };
case 2: { Marken_1 setpos getpos SP3; };
case 3: { Marken_1 setpos getpos SP1; };
};

start= 999;


Mit der "start=... " Zeile kannst du die einzelnen cases testen.

Tarsius 09.03.2013 16:54

Danke Rettich. Werde es wenn ich von Arbeit komme mal testen. Zwar ist die Wahrscheinlichkeit auf "SP1" so um 3% höher als bei den anderen Beiden. xD
Aber darauf ist ja geschissen. :)

Tarsius 10.03.2013 02:58

Also mit switch schaltet er komplett auf stur.

Code:

_start = round random 3;

switch (_start) do {
    case 0: { Obj_Mis_Target setpos getpos Obj_Mis_01; };
    case 1: { Obj_Mis_Target setpos getpos Obj_Mis_02; };
    case 2: { Obj_Mis_Target setpos getpos Obj_Mis_03; };
    case 3: { Obj_Mis_Target setpos getpos Obj_Mis_01; };
};

Es wird kein CASE ausgelöst, obwohl die Zahl korrekt auf 0,1,2,3 gerundet wird.

Und auch im Hauptfall bleibt das Problem erhalten.

Ich mein. Warum in drei Teufels Namen, geht er mit ner "2" überhaupt ins erste IF rein, wenn dessen "Zugang" nur für 1 gestattet ist?

http://www.imgbox.de/users/Tarsius/arma2_error_02.jpg

Asso-Loki 10.03.2013 10:15

Du wärst wohl besser früher ins Bett gegangen. ;)

Du hast zum einen vergessen die If- Abfragen mit ";" zu beenden, was auch entsprechend in der ArmA3.rpt vermerkt wird (bitte doch immer zuerst mal da nachgucken, bevor man in einem Forum um Hilfe ersucht).

Zum anderen verwendest Du "exit" in einem sqf- Script. Das wird dort ignoriert. Das kann man bloss in einem sqs- Script verwenden. Daher funktioniert Dein Vorhaben so auch dann nicht befriedigend, wenn Du die Strichpunkte korrekt setzt. Steht _start auf 2 oder 3 klappts ordentlich. Steht _start auf 1 wird die erste If- Abfrage korrekt ausgeführt und danach der else- Teil der zweiten If- Abfrage. Steht _start auf 0 dann wird natürlich auch wieder der Else- Teil der zweiten if- Abfrage ausgeführt.

switch- do - case bietet sich - wie von Rettich schon angemerkt - als Lösung an.

Edit: Die von Dir gepostete switch - do - case -Abfrage schaltet nicht auf stur. Es wird dabei korrekt auf den case- Abschnitt gesprungen welcher dem Wert von _start entspricht. Das Problem muss also beim Code innerhalb des case -Blocks liegen
Code:

Obj_Mis_Target setpos getpos Obj_Mis_01;
. Was sagt den die ArmA3.rpt dazu?

Tarsius 10.03.2013 11:55

Jipp, Bett wäre ne gute Idee gewesen. Vorallem weil ich wieder auf dem Weg zur Arbeit bin. xD

Ich hab gestern auch schon mal hinter "}" ein ";" gesetzt. Es ändert leider nichts. Es werden in beiden Fällen auch keine Beschwerden gemeldet. (Ich starte über diese Kommandozeilen-Erweiterung die einem Scripfehler ingame meldet.)

Auch wenn ich _start explizit eine "2" oder "3" zuweise geht er ins erste IF. Demnach fällt ein Fehler mit "round" oder "random" auch aus.

Zumal es eben (für mich persönlich) nicht erklärt, warum er mit ner 2 oder 3 ins erste IF geht. Er könnte gleich ans ende wackeln, oder nen Fehler melden wenn es an den ";" liegt. Aber rein zu gehen, ist für mich das Unlogischste.

Beim CASE habe ich mir zum debugen auch einfach nur mal nen Text ausgeben lassen. Jedoch kam keiner. Er ist in keine CASE-Ebene gesprungen. Demnach konnte es nicht an der Zeile mit der "Zuweisung" liegen. Zumal diese Zuweisung korrekt funktioniert, wenn ich sie einfach nur in die Datei ballere.

Für den Hinweis mit dem Exit danke ich dir. Ist gut zu wissen. Ich werde es mir heut abend noch mal zu Gemüte führen.

Kann es ja mal über ne Verschachtelung versuchen, in der ich die beiden anderen Optionen ins ELSE des ersten IF`s packe.

Code:

IF {1} THEN {Pos01} ELSE { IF {2} THEN {Pos02} ELSE { Pos03 };};
Wobei es ja theoretisch keinen Unterschied machen dürfte. oO

Wünsche allen einen schönen Sonntag.

Vienna 10.03.2013 13:21

Code:

_objekte = [Obj_Mis_01,Obj_Mis_02,Obj_Mis_03,Obj_Mis_04];
Obj_Mis_Target setpos (getpos(_objekte select(floor(random(count _objekte)))));

Die Anzahl der Objekte in _objekte ist egal.


http://hx3.de/editing-scripting-167/...26/#post431885

Asso-Loki 10.03.2013 14:09

Ich habe - gewissenhaft wie ich bin :D - natürlich sowohl Deine If- Variante wie auch Deine switch-do-case Geschichte brav nachgestellt (bei der If- Variante sogar ohne ";") und überprüft. Die fehlenden ";" werden in der ArmA3.rpt als Fehler eingetragen. Mit ";" entspricht das Verhalten dem von mir beschrieben. Die switch-do-case flutscht absolut sauber.

Aaaaabeeeer, nimm einfach Viennas Variante. Sauber, effizient, übersichtlich...schlicht die optimale Wahl.

Tarsius 10.03.2013 16:58

Danke Asso-Loki für die Mühe. Werde es heut Abend noch einmal testen. Auch wenn ich wie du schon sagst, wohl eher zu Vienna`s Variante greife. Die sieht einfach charmant aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:45 Uhr.

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 117 118 119