while: Difference between revisions
Jump to navigation
Jump to search
Lou Montana (talk | contribs) m (Fix page, remove deprecated for links) |
Lou Montana (talk | contribs) m (Text replacement - "[] spawn" to "0 spawn") |
||
(44 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
{{ | {{RV|type=command | ||
| | |game1= ofp | ||
|version1= 1.85 | |||
|1. | |game2= ofpe | ||
|version2= 1.00 | |||
| | |game3= arma1 | ||
|version3= 1.00 | |||
| | |game4= arma2 | ||
|version4= 1.00 | |||
| | |game5= arma2oa | ||
|version5= 1.50 | |||
|game6= tkoh | |||
|version6= 1.00 | |||
|game7= arma3 | |||
|version7= 0.50 | |||
| | |gr1= Program Flow | ||
| [[ | |descr= Repeats [[Code]] while the given condition is [[true]]. A part of [[while]]-[[do]] construct. | ||
{{Feature|important| | |||
* A [[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 {{Link|#Example 3}}). | |||
* 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]]. | |||
}} | }} | ||
|s1= [[while]] condition | |||
|p1= condition: [[Code]] | |||
|r1= [[While Type]] | |||
|x1= <sqf>while { a < b } do { a = a + 1 };</sqf> | |||
< | |||
< | |||
|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> | ||
0 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)]; | |||
}; | |||
</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> | ||
}} | |||
</ | |||
Latest revision as of 21:24, 2 September 2024
Description
- Description:
- Repeats Code while the given condition is true. A part of while-do construct.
- Groups:
- Program Flow
Syntax
- Syntax:
- while condition
- Parameters:
- condition: Code
- Return Value:
- While Type
Examples
- Example 1:
- Example 2:
- A practical example: Repair all members of a group to such a level that they are able to stand up:
- Example 3:
- 0 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
- 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.
Categories:
- Scripting Commands
- Introduced with Operation Flashpoint version 1.85
- Operation Flashpoint: New Scripting Commands
- Operation Flashpoint: Scripting Commands
- Operation Flashpoint: Elite: Scripting Commands
- ArmA: Armed Assault: Scripting Commands
- Arma 2: Scripting Commands
- Arma 2: Operation Arrowhead: Scripting Commands
- Take On Helicopters: Scripting Commands
- Arma 3: Scripting Commands
- Command Group: Program Flow