davidoss 552 Posted January 25, 2018 Hi i have bad fillings that this function bellow need some exit if true How to write this correctly? fnc_checkPos = { /* by DaVidoSS Returns true if given position is in specific markers parameters: 0: ARRAY position 1: ARRAY markers return BOOLEAN */ params [ ["_pos",[],[[]]], ["_markers",[],[[]]] ]; private _return = ({_pos inArea _x} forEach _markers); (_return) }; Share this post Link to post Share on other sites
code34 248 Posted January 25, 2018 i have also a bad feeling that this function should also need some exit with false https://community.bistudio.com/wiki/exitWith Share this post Link to post Share on other sites
davidoss 552 Posted January 25, 2018 For sure. How to exit forEach loop? Share this post Link to post Share on other sites
code34 248 Posted January 25, 2018 There is a link in my answer Share this post Link to post Share on other sites
Schatten 284 Posted January 25, 2018 @davidoss, fnc_checkPos = { /* by DaVidoSS Returns true if given position is in specific markers parameters: 0: ARRAY position 1: ARRAY markers return BOOLEAN */ params [ ["_pos",[],[[]]], ["_markers",[],[[]]] ]; ({_pos inArea _x} count _markers) > 0 }; 2 Share this post Link to post Share on other sites
davidoss 552 Posted January 25, 2018 Simplest solutions are always hidden for me. Thanks Share this post Link to post Share on other sites
Grumpy Old Man 3545 Posted January 25, 2018 Well, that was a fun read. Cheers 1 Share this post Link to post Share on other sites
code34 248 Posted January 25, 2018 yes better but it doesnt solve totaly the problem Quote this function bellow need some exit if true With a little help, davidboss should solve this himself, he has got now 1500 posts on this forum :) 1 Share this post Link to post Share on other sites
davidoss 552 Posted January 25, 2018 Oh come on it was just blackout.... Share this post Link to post Share on other sites
code34 248 Posted January 25, 2018 In normal condition, with the count / foreach scope, you will iterate all over the array until the end (there is no conditionnal evaluation outside of scope with thoses commands) to go outside of anyscope faster, you can use a conditionnal break condition like : exitwith or try/catch/exception or breakto/breakout Share this post Link to post Share on other sites
Schatten 284 Posted January 25, 2018 Just post this here: https://community.bistudio.com/wiki/Code_Optimisation#forEach_vs_count. Share this post Link to post Share on other sites
code34 248 Posted January 25, 2018 It s not an execution time optimisation, you just go out of the loop before all iterations are done. Share this post Link to post Share on other sites
code34 248 Posted January 26, 2018 i believe this subject should be more deeply analyze to understand why there is no execution time optimisation. Have to look about this. Share this post Link to post Share on other sites
Schatten 284 Posted January 26, 2018 I think even if my solution is not more optimal in terms of execution time, it is more simple and elegant than using exitWith: _isWithinArea = false; { if (_pos inArea _x) exitWith { _isWithinArea = true; }; } forEach _markers; _isWithinArea 1 Share this post Link to post Share on other sites
Midnighters 152 Posted January 26, 2018 exitwith would exit the current scope with the value last returned correct? so something like this: { if(_x == 3) exitWith { "target" }; } forEach _targetArray; should return "target" right? Share this post Link to post Share on other sites
Schatten 284 Posted January 26, 2018 @Midnighters, you are right. But if _targetArray doesn't contain 3, nil is returned. In case you need true/false you can use this code: { if(_x == 3) exitWith { true }; false } forEach _targetArray; Share this post Link to post Share on other sites
Midnighters 152 Posted January 26, 2018 Just now, Schatten said: @Midnighters, you are right. But if _targetArray doesn't contain 3, nil is returned. correct, just a hypothetical. I don't necessarily agree that just because it "works" means it should be used. your example would be fine if something like an event handler is added and the same variable needs to be used within. Like "get/set" variable on player / server to retrieve the same info inside the event handler. Share this post Link to post Share on other sites
code34 248 Posted January 26, 2018 34 minutes ago, Schatten said: I think even if my solution is not more optimal in terms of execution time, it is more simple and elegant than using exitWith: _isWithinArea = false; { if (_pos inArea _x) exitWith { _isWithinArea = true; }; } forEach _markers; _isWithinArea yes, i m agree with you, your solution is more elegant but also more optimal in execution time :) in this case, exitwith {} is slower than simple condition evaluation, it s just opposite what we can logical think. in fact, I think most of the time is consumed by the engine itself, and a small part by the user code. i have to check this. Share this post Link to post Share on other sites
code34 248 Posted January 26, 2018 i m back, i had checked yesterday with this code, and i dont know why it seems the first count method is faster. _someoneIsNear = {_x distance [0,0,0] < 1000} count allUnits > 0; //is still faster than _someoneIsNear = { if (_x distance [0,0,0] < 1000) exitWith {true}; false } forEach allUnits; but i just did this test with a big array fill with (~12000 char) strings. The first entrie hit the right result (worst case) for first algo private _array = ["tata", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto", "toto"]; private _time = diag_tickTime; for "_i" from 0 to 10000 step 1 do { /* _test = { { if (_x isEqualTo "tata") exitWith {true;}; false; } count _array; };*/ /* { (_x isEqualTo "tata") } count _array > 0;*/ }; _time = diag_tickTime - _time; hintc format ["%1", _time]; /* _test = { { if (_x isEqualTo "tata") exitWith {true;}; false; } count _array; };*/ take around 0.5s (in schedule env) /* { (_x isEqualTo "tata") } count _array > 0;*/ take around 73s (in schedule env) you must pay close attention to these results and variations in the evaluation method in the scope 2 Share this post Link to post Share on other sites
Grumpy Old Man 3545 Posted January 26, 2018 //tested with 100 units on stratis _someoneIsNear = {_x distance [0,0,0] < 1000} count allUnits > 0; //0.136295 ms _someoneIsNear = (count (allUnits select {_x distance [0,0,0]) < 1000) > 0; //0.0114 ms Cheers 2 Share this post Link to post Share on other sites
Schatten 284 Posted January 26, 2018 27 minutes ago, code34 said: i dont know why it seems the first count method is faster Probably because you are comparing strings and not coordinates, I guess. Share this post Link to post Share on other sites
dimon 32 Posted February 1, 2018 return = if ({if (_pos inArea _x) exitwith {1}} count _markers > 0) then {true}else{false}; Share this post Link to post Share on other sites
pierremgi 4850 Posted February 1, 2018 forEach can be more accurate sometimes: _result = ({if (_pos inArea _x) exitWith {true};false} forEach _markers) // true or false or even: _result = ({if (_pos inArea _x) exitWith {_pos};[0,0,0]} forEach _markers) // _pos or [0,0,0] _result = ({if (_pos inArea _x) exitWith {_x}; "" } forEach _markers) // the marker name or "" Share this post Link to post Share on other sites