while: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
m (Text replacement - "\[\[Category:[ _]?Scripting[ _]Commands[ _]Arma[ _]3(\|.*)\]\]" to "{{GameCategory|arma3|Scripting Commands}}")
m (Some wiki formatting)
(32 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{Command|Comments=
{{RV|type=command
____________________________________________________________________________________________


| ofpr |Game name=
|game1= ofp
|version1= 1.85


|gr1= Program Flow |GROUP1=
|game2= ofpe
|version2= 1.00


|game3= arma1
|version3= 1.00


|game4= arma2
|version4= 1.00


|1.85|Game version=
|game5= arma2oa
____________________________________________________________________________________________
|version5= 1.50


| Repeats [[Code]] while condition is [[true]]. A part of [[while]] [[do]] construct. |Description=
|game6= tkoh
____________________________________________________________________________________________
|version6= 1.00


| '''while''' condition |Syntax=
|game7= arma3
|version7= 0.50


|p1= condition: [[Code]]
|gr1= Program Flow


| [[While Type]] |Return value=
|descr= Repeats [[Code]] while the given condition is [[true]]. A part of [[while]]-[[do]] construct.
____________________________________________________________________________________________
{{Feature | Important | [[while]] loop does not have any suspension, meaning that if used in [[Scheduler#Scheduled_Environment|scheduled environment]] without any suspension ([[sleep]] or [[uiSleep]]) the code will run multiple times per frame and consumes the 3 ms per frame scheduler execution limit. This should be avoided if not intended (see {{HashLink|#Example 3}}).}}
 
|s1= [[while]] condition
|x1= <code>[[while]] {a < b} [[do]] {a = a + 1};</code>
|x2= A practical example: Repair all members of a group to such a level that they are able to stand up: <code>{
    [[while]] {![[canStand]] [[Magic Variables|_x]] && [[alive]] [[Magic Variables|_x]]} [[do]] {
        [[Magic Variables|_x]] [[setDamage]] ([[damage]] [[Magic Variables|_x]] - 0.01);
    };
} [[forEach]] [[units]] [[group]] unitname;</code> |Example 2=
____________________________________________________________


| [[Control Structures]], [[waitUntil]], [[for]], [[do]] |See also=
|p1= condition: [[Code]]
}}


<h3 style="display:none">Notes</h3>
|r1= [[While Type]]
<dl class="command_description">
<!-- Note Section BEGIN -->


<dd class="notedate">Posted on May 14, 2008
|x1= <sqf>while { a < b } do { a = a + 1 };</sqf>
<dt class="note">[[User:Kronzky|Kronzky]]
<dd class="note">The boolean code that's used to evaluate the while condition can be preceded by code that executes a regular command.<br>
<code>[[while]] {_a =_a + 1; _a < 10} [[do]] {...}</code>
<!-- Note Section END -->
</dl>


<h3 style="display:none">Bottom Section</h3>
|x2= A practical example: Repair all members of a group to such a level that they are able to stand up:
<sqf>
{
if (alive _x) then
{
while { not canStand _x } do
{
_x setDamage (damage _x - 0.01);
};
};
} forEach units group unitname;
</sqf>


|x3= <sqf>
[] spawn {
// warning: while loop without suspension executes multiple times per frame
private _counter = 0;
private _endTime = diag_tickTime + 5;
private _frameNo = diag_frameNo;
while { diag_tickTime < _endTime } do
{
_counter = _counter + 1;
};
// in an empty mission, the _counter may go well over 2000 times per frame!
hint format ["Average Execution: %1 times per frame", _counter / (diag_frameNo - _frameNo)];


[[Category:Scripting Commands|{{uc:{{PAGENAME}}}}]]
// with suspension
[[Category:Scripting Commands OFP 1.96|{{uc:{{PAGENAME}}}}]]
private _counter = 0;
[[Category:Scripting Commands OFP 1.99|{{uc:{{PAGENAME}}}}]]
private _endTime = diag_tickTime + 5;
{{GameCategory|arma1|Scripting Commands}}
private _frameNo = diag_frameNo;
[[Category:Scripting Commands Arma 2|{{uc:{{PAGENAME}}}}]]
while { diag_tickTime < _endTime } do
[[Category:Scripting Commands Take On Helicopters|{{uc:{{PAGENAME}}}}]]
{
{{GameCategory|arma3|Scripting Commands}}
_counter = _counter + 1;
uiSleep 0.001; // waits at least 1 frame
};
// _counter says one per frame, as expected
hint format ["Average Execution: %1 times per frame", _counter / (diag_frameNo - _frameNo)];
};
</sqf>


|seealso= [[Control Structures]] [[waitUntil]] [[for]] [[do]]
}}


{{Note
|user= Kronzky
|timestamp= 20080514084000
|text= The boolean code that is used to evaluate the while condition can be preceded by code that executes a regular command.
<sqf>while { _a =_a + 1; _a < 10 } do { /* ... */ };</sqf>
}}


<!-- CONTINUE Notes -->
{{Note
<dl class="command_description">
|user= Killzone Kid
<dd class="notedate">Posted on August 30, 2014 - 08:12 (UTC)</dd>
|timestamp= 20140830081200
<dt class="note">[[User:Killzone Kid|Killzone Kid]]</dt>
|text= In [[Scheduler#Unscheduled_Environment|non-scheduled environment]], [[while]] [[do]] loop is limited to 10,000 iterations, after which it exits even if condition is still [[true]]. In [[Scheduler#Unscheduled_Environment|scheduled environment]] no such limit exists.
<dd class="note">
}}
In [[Scheduler#Unscheduled_Environment|non-scheduled environment]], [[while]] [[do]] loop is limited to 10,000 iterations, after which it exits even if condition is still [[true]]. In [[Scheduler#Unscheduled_Environment|scheduled environment]] no such limit exists.
</dd>
</dl>
<!-- DISCONTINUE Notes -->

Revision as of 11:49, 12 May 2022

Hover & click on the images for description

Description

Description:
Repeats Code while the given condition is true. A part of while-do construct.
A while loop does not have any suspension, meaning that if used in scheduled environment without any suspension (sleep or uiSleep) the code will run multiple times per frame and consumes the 3 ms per frame scheduler execution limit. This should be avoided if not intended (see Example 3).
Groups:
Program Flow

Syntax

Syntax:
while condition
Parameters:
condition: Code
Return Value:
While Type

Examples

Example 1:
while { a < b } do { a = a + 1 };
Example 2:
A practical example: Repair all members of a group to such a level that they are able to stand up:
{ if (alive _x) then { while { not canStand _x } do { _x setDamage (damage _x - 0.01); }; }; } forEach units group unitname;
Example 3:
[] spawn { // warning: while loop without suspension executes multiple times per frame private _counter = 0; private _endTime = diag_tickTime + 5; private _frameNo = diag_frameNo; while { diag_tickTime < _endTime } do { _counter = _counter + 1; }; // in an empty mission, the _counter may go well over 2000 times per frame! hint format ["Average Execution: %1 times per frame", _counter / (diag_frameNo - _frameNo)]; // with suspension private _counter = 0; private _endTime = diag_tickTime + 5; private _frameNo = diag_frameNo; while { diag_tickTime < _endTime } do { _counter = _counter + 1; uiSleep 0.001; // waits at least 1 frame }; // _counter says one per frame, as expected hint format ["Average Execution: %1 times per frame", _counter / (diag_frameNo - _frameNo)]; };

Additional Information

See also:
Control Structures waitUntil for do

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
Kronzky - c
Posted on May 14, 2008 - 08:40 (UTC)
The boolean code that is used to evaluate the while condition can be preceded by code that executes a regular command.
while { _a =_a + 1; _a < 10 } do { /* ... */ };
Killzone Kid - c
Posted on Aug 30, 2014 - 08:12 (UTC)
In non-scheduled environment, while do loop is limited to 10,000 iterations, after which it exits even if condition is still true. In scheduled environment no such limit exists.