for: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
m (added control structure category)
(for pages merging (four pages merging: for do, for var, for forspec)
Line 1: Line 1:
{{Command|= Comments
{{Command|Comments=
____________________________________________________________________________________________
____________________________________________________________________________________________


| arma |= Game name
| arma |Game name=


|1.00|= Game version
|1.00|Game version=
____________________________________________________________________________________________
____________________________________________________________________________________________


| This operator creates a [[For Type]] which is used in the for-constructs (There is the [[for forspec]] and the [[for var]] syntax available for this construct) |= Description
 
| This operator creates a [[For Type]] which is used in the for-constructs.
{{Important|Alternative syntax {{Inline code|[[for]] ''array'' [[do]] ''code''}} is [[Code_Optimisation#for|slower]] and should not be used.}} |Description=
____________________________________________________________________________________________
____________________________________________________________________________________________


| '''for''' arg |= Syntax
| [[for]] arguments |Syntax=


|p1= arg: [[String]] or [[Array]] - When using String it declares the index variable name like "_myVar" and when using Array it must be a 3-dimensional Array of [[Code]]|= Parameter 1
|p1= arguments: [[String]] - declares the index variable name like "_myVar". [[from]] and [[to]] are required, [[step]] is optional. |Parameter 1=


| [[For Type]] |= Return value
| [[For Type]] |Return value=
____________________________________________________________________________________________
____________________________________________________________________________________________


|x1= <code>[[for]] "_i" [[from]] 1 [[to]] 10 [[do]] {[[debugLog]] _i;};</code> |= Example 1
|s2= [[for]] array |Syntax 2=
|x2= <code>[[for]] "_i" [[from]] 9 [[to]] 1 [[step]] -2 [[do]] {[[debugLog]] _i;};</code> |= Example 2
 
|x3= <code> [[for]] [{_i=0}, {_i < 10}, {_i = _i + 1}] [[do]] {hint str _i};</code> |=Example 3
|p21= array: [[Array]] - a 3-dimensional array of [[Code]] as follow: [init, condition, codeToExecute] |Parameter 21=
 
|r2= [[For Type]] |Return value 2=
____________________________________________________________________________________________
____________________________________________________________________________________________


| [[for forspec|for [ ]]], [[for_do|for do]], [[Control Structures]] |= See also
|x1= <code>[[for]] "_i" [[from]] 1 [[to]] 10 [[do]] { [[systemChat]] [[str]] _i; };</code> |Example 1=
 
|x2= <code>[[for]] "_i" [[from]] 9 [[to]] 1 [[step]] -2 [[do]] { [[systemChat]] [[str]] _i; };</code> |Example 2=
 
|x3= <code>[[for]] [{ _i = 0 }, { _i < 10 }, { _i = _i + 1 }] [[do]] { [[systemChat]] [[str]] _i }; {{codecomment|// deprecated, should not be used}}</code> |Example 3=
 
|x4 = <code>{{codecomment|// BAD CODE}}
_i = 100;
[[for]] [{_i = 0}, {_i < 5}, {_i = _i + 1}] [[do]] {};
[[hint]] [[str]] _i; {{codecomment|// 5}}


{{codecomment|// GOOD CODE ([[private]] keyword is recommended)}}
_i = 100;
[[for]] [{[[private]] _i = 0}, {_i < 5}, {_i = _i + 1}] [[do]] {};
[[hint]] [[str]] _i; {{codecomment|// 100}}</code> |Example 4=
____________________________________________________________________________________________
| [[Control Structures]], [[while]], [[do]] |See also=
}}
}}


<h3 style="display:none">Notes</h3>
<h3 style="display:none">Notes</h3>
<dl class="command_description">
<dl class="command_description">
<!-- Note Section BEGIN -->


[[Category:Scripting Commands|FOR]]
<dd class="notedate">Posted on 29 April 2010 (CEST)
[[Category:Scripting Commands ArmA|FOR]]
<dt class="note">[[User:Alef|alef]]
<dd class="note"><code>[[for]] "_i" [[from]] 0 [[to]]  0 [[do]] {}; {{codecomment|// will do once, with _i {{=}} 0}}
[[for]] "_i" [[from]] 0 [[to]] -1 [[do]] {}; {{codecomment|// will not do}}
</code>
 
<dd class="notedate">Posted on Apr 15, 2014 - 12:54
<dt class="note">'''[[User:ffur2007slx2_5|ffur2007slx2_5]]'''<dd class="note">
 
*{{GVI|arma 3|1.16}} Please note the difference between the two syntaxed; {{Inline code|[[for]] ''arguments''}} detects Boolean in each scope while {{Inline code|[[for]] ''array''}} doesn’t. e.g.
{| class="wikitable sortable"
! command
! Structure
! Summary
|-
| [[for]]&nbsp;''array''
|
a = 0; b = [[true]];
[[for]] [{ _i = 0 }, { _i < 10 && b }, { _i = _i + 1 }] [[do]] {
a = a + 1;
[[if]] (a >= 7) [[then]] {b = [[false]]}
}
| loop can be exited via Boolean control, possible workaround can be like [[BIS_fnc_areEqual]]
|-
|[[for]]&nbsp;''arguments''
|
a = 0;
[[for]] "_i" [[from]] 0 [[to]] 10 [[do]] {
a = a + 1;
[[if]] (a >= 7) [[exitwith]] {}
};
| has to be exited via [[exitWith]]
 
|}
<br>
*Never try to tell a decimal number via binary number in a loop; otherwise the loop will be infinite:
<code>[[for]] [{_a = 0},{_a != 1},{_a = _a + 0.1}] [[do]] {}; {{codecomment|// an infinite loop; _a will never be 1 so the scope will always be true}}</code>
Any binary number behind the decimal point is always the sum of 1/2, 1/4, 1/8, 1/16 etc. so decimal number with odd denominator like 1/3 or 1/10 cannot be exactly equal to each other.
* Avoid too large factorial multiply which may loose the leading indicator in result. And 12 is the biggest accessable factor in this example.
<code>[[for]] [{_a = 2; _b = 1;},{_a < 100},{_a = _a + 1}] [[do]] {_b = _b * _a}; {{codecomment|// _b = 1.#INF}}</code>
 
<dd class="notedate">Posted on June 4, 2015 - 19:27 (UTC)</dd>
<dt class="note">[[User:Killzone Kid|Killzone Kid]]</dt>
<dd class="note">
Variable name doesn't have to start with _. could be:<code>[[for]] "LAlala" [[from]] 0 [[to]] 0 [[do]] {[[hint]] [[str]] LAlala}; {{codecomment|// 0}}</code>
The variable ''LAlala'' will exist only inside [[do]] {} scope and will not overwrite any variable of the same name that existed before.
</dd>
 
<dd class="notedate">Posted on June 4, 2015 - 19:45 (UTC)</dd>
<dt class="note">[[User:Nickorr|Nickorr]]</dt>
<dd class="note">
Dont use this notation if you plan to change the cycle ranges dynamically. The range values are checked only before the cycle started. Use [[for_forspec]] instead. <br/>
 
Example, that won't work correctly:
<code><nowiki>_xy = [1,2,3,4,5,6,7,8,9,10];
for "_i" from 0 to (count _xy - 1) do {
if ( _xy select _i == 3 ) then {
_xy deleteAt _i;
_i = _i - 1;
};
};</nowiki></code>
(Here the <tt><nowiki>_i = 9</nowiki></tt> step will still be checked by the cycle, which will lead to "out of the array range" error.) <br/>
This code will work correctly:
<code><nowiki>_xy = [1,2,3,4,5,6,7,8,9,10];
for [{_i=1},{_i<=(count _xy - 1)},{_i=_i+1}] do {
if ( _xy select _i == 3 ) then {
_xy deleteAt _i;
_i = _i - 1;
};
};</nowiki></code>
(The last step here will be <tt><nowiki>_i = 8</nowiki></tt> with array looking like this: <tt><nowiki>[1,2,4,5,6,7,8,9,10]</nowiki></tt>)
</dd>
 
<dd class="notedate">Posted on January 29, 2016 - 05:18 (UTC)</dd>
<dt class="note">[[User:DreadedEntity|DreadedEntity]]</dt>
<dd class="note">
For loops can be safely nested. This means that there should not be any problems with recursion.
<code>_array = [];
[[for]] "_i" from 0 to 3 do
{
[[for]] "_i" from 0 to 3 do
{
_array [[pushBack]] _i;
};
_array [[pushBack]] _i;
};
[[hint]] [[str]] _array;</code>
</dd>
 
<!-- Note Section END -->
</dl>
 
[[Category:Scripting Commands|{{uc:{{PAGENAME}}}}]]
[[Category:Scripting Commands ArmA|{{uc:{{PAGENAME}}}}]]
[[Category:Scripting Commands ArmA2|{{uc:{{PAGENAME}}}}]]
[[Category:Scripting Commands ArmA2|{{uc:{{PAGENAME}}}}]]
[[Category:Scripting_Commands_Take_On_Helicopters|{{uc:{{PAGENAME}}}}]]
[[Category:Scripting Commands Arma 3|{{uc:{{PAGENAME}}}}]]
[[Category:Scripting Commands Arma 3|{{uc:{{PAGENAME}}}}]]
[[Category:ArmA: Control Structures|{{uc:{{PAGENAME}}}}]]
[[Category:ArmA: Control Structures|{{uc:{{PAGENAME}}}}]]
[[Category:Scripting_Commands_Take_On_Helicopters|{{uc:{{PAGENAME}}}}]]

Revision as of 22:12, 4 February 2019

-wrong parameter ("Arma") defined!-1.00
Hover & click on the images for description

Description

Description:
This operator creates a For Type which is used in the for-constructs.
Alternative syntax for array do code is slower and should not be used.
Groups:
Uncategorised

Syntax

Syntax:
for arguments
Parameters:
arguments: String - declares the index variable name like "_myVar". from and to are required, step is optional.
Return Value:
For Type

Alternative Syntax

Syntax:
for array
Parameters:
array: Array - a 3-dimensional array of Code as follow: [init, condition, codeToExecute]
Return Value:
For Type

Examples

Example 1:
for "_i" from 1 to 10 do { systemChat str _i; };
Example 2:
for "_i" from 9 to 1 step -2 do { systemChat str _i; };
Example 3:
for [{ _i = 0 }, { _i < 10 }, { _i = _i + 1 }] do { systemChat str _i }; // deprecated, should not be used
Example 4:
// BAD CODE _i = 100; for [{_i = 0}, {_i < 5}, {_i = _i + 1}] do {}; hint str _i; // 5 // GOOD CODE (private keyword is recommended) _i = 100; for [{private _i = 0}, {_i < 5}, {_i = _i + 1}] do {}; hint str _i; // 100

Additional Information

See also:
Control Structureswhiledo

Notes

Report bugs on the Feedback Tracker and/or discuss them on the Arma Discord or on the Forums.
Only post proven facts here! Add Note

Notes

Posted on 29 April 2010 (CEST)
alef
for "_i" from 0 to 0 do {}; // will do once, with _i = 0 for "_i" from 0 to -1 do {}; // will not do
Posted on Apr 15, 2014 - 12:54
ffur2007slx2_5
  • Arma 3 logo black.png1.16 Please note the difference between the two syntaxed; for arguments detects Boolean in each scope while for array doesn’t. e.g.
command Structure Summary
for array
a = 0; b = true;
for [{ _i = 0 }, { _i < 10 && b }, { _i = _i + 1 }] do {
	a = a + 1; 
	if (a >= 7) then {b = false}
}
loop can be exited via Boolean control, possible workaround can be like BIS_fnc_areEqual
for arguments
a = 0;
for "_i" from 0 to 10 do {
	a = a + 1;
	if (a >= 7) exitwith {}
};
has to be exited via exitWith


  • Never try to tell a decimal number via binary number in a loop; otherwise the loop will be infinite:

for [{_a = 0},{_a != 1},{_a = _a + 0.1}] do {}; // an infinite loop; _a will never be 1 so the scope will always be true Any binary number behind the decimal point is always the sum of 1/2, 1/4, 1/8, 1/16 etc. so decimal number with odd denominator like 1/3 or 1/10 cannot be exactly equal to each other.

  • Avoid too large factorial multiply which may loose the leading indicator in result. And 12 is the biggest accessable factor in this example.

for [{_a = 2; _b = 1;},{_a < 100},{_a = _a + 1}] do {_b = _b * _a}; -no comment defined-

Posted on June 4, 2015 - 19:27 (UTC)
Killzone Kid
Variable name doesn't have to start with _. could be:for "LAlala" from 0 to 0 do {hint str LAlala}; // 0 The variable LAlala will exist only inside do {} scope and will not overwrite any variable of the same name that existed before.
Posted on June 4, 2015 - 19:45 (UTC)
Nickorr
Dont use this notation if you plan to change the cycle ranges dynamically. The range values are checked only before the cycle started. Use for_forspec instead.
Example, that won't work correctly: _xy = [1,2,3,4,5,6,7,8,9,10]; for "_i" from 0 to (count _xy - 1) do { if ( _xy select _i == 3 ) then { _xy deleteAt _i; _i = _i - 1; }; }; (Here the _i = 9 step will still be checked by the cycle, which will lead to "out of the array range" error.)
This code will work correctly: _xy = [1,2,3,4,5,6,7,8,9,10]; for [{_i=1},{_i<=(count _xy - 1)},{_i=_i+1}] do { if ( _xy select _i == 3 ) then { _xy deleteAt _i; _i = _i - 1; }; }; (The last step here will be _i = 8 with array looking like this: [1,2,4,5,6,7,8,9,10])
Posted on January 29, 2016 - 05:18 (UTC)
DreadedEntity
For loops can be safely nested. This means that there should not be any problems with recursion. _array = []; for "_i" from 0 to 3 do { for "_i" from 0 to 3 do { _array pushBack _i; }; _array pushBack _i; }; hint str _array;