Jump to content

Recommended Posts

 

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

@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
};

 

  • Like 2

Share this post


Link to post
Share on other sites

Simplest solutions are always hidden for me. Thanks

Share this post


Link to post
Share on other sites

yes better but it doesnt solve totaly the problem :drinking2:

 

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 :)

  • Like 1

Share this post


Link to post
Share on other sites

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

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

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

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

 

  • Thanks 1

Share this post


Link to post
Share on other sites

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

@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
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
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

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

  • Like 2

Share this post


Link to post
Share on other sites
//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

  • Like 2

Share this post


Link to post
Share on other sites
27 minutes ago, code34 said:

i dont know why it seems the first count method is faster

:shrug: Probably because you are comparing strings and not coordinates, I guess.

Share this post


Link to post
Share on other sites
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

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

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

×