call: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
mNo edit summary
m (Fixed example code)
 
(47 intermediate revisions by 7 users not shown)
Line 1: Line 1:
{{Command|= Comments
{{RV|type=command
____________________________________________________________________________________________


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


|1.85|= Game version
|game2= ofpe
____________________________________________________________________________________________
|version2= 1.00


| Executes the function string.
|game3= arma1
|version3= 1.00


The ''argument(s)'' (if any) are passed as _this. (''argument(s)'' are passed in an array).
|game4= arma2
|version4= 1.00


To execute a [[sleep]] function in the called code, execute it with [[spawn]] instead. |= Description
|game5= arma2oa
____________________________________________________________________________________________
|version5= 1.50


| argument(s) '''call''' body |= Syntax
|game6= tkoh
|version6= 1.00


|p1= argument(s): [[Any Value]] - Optional. Argument that is passed to the function in the "_this" variable. |= Parameter 1
|game7= arma3
|version7= 0.50


|p2= body: [[Code]] - A function body provided directly 'inline' or
|gr1= Program Flow
the [[String]] returned from the commands [[loadFile]] or [[preprocessFile]].


|descr= Adds given set of compiled instructions to the current stack and waits for it to finish and return, provides an option to pass arguments to the executed [[Code]].
See [[Scheduler]] to learn more about how the code is executed and behaves.


| [[Anything]] - 
|s1= [[call]] code
The last value given in the function is returned. See the topic [[Function#Return_Values|Function]] for more information. |= Return value
____________________________________________________________________________________________


|x1= <code>call {"x <nowiki>=</nowiki> 3"}</code> |= Example 1
|p1= code: [[Code]] - [[compile]]d instructions
{{Feature|ofp|{{ofp}} takes [[String]].}}


|x2= ''[[:Category:Operation Flashpoint|Operation Flashpoint]] syntax:''
|r1= [[Anything]] - the last value given in the function is returned. See the topic [[Function#Return_Values|Function]] for more information.
<code>_n <nowiki>=</nowiki> 3;<br />call [[format]] [{var%1 <nowiki>=</nowiki> 0},_n];</code>
''[[:Category:Armed Assault|Armed Assault]] syntax:''
<code>_n <nowiki>=</nowiki> 3;<br />call [[compile]] [[format]] ["var%1 <nowiki>=</nowiki> 0",_n];</code>
result of both syntaxes is '''var3 <nowiki>=</nowiki> 0'''|= Example 2


|x3= ''[[:Category:Operation Flashpoint|Operation Flashpoint]] syntax:''
|s2= args [[call]] code
<code>_fAdd <nowiki>=</nowiki> loadFile "add.sqf"
[1,2] call _fAdd</code>
''[[:Category:Armed Assault|Armed Assault]] syntax:''
<code>_fAdd <nowiki>=</nowiki> [[compile]] loadFile "add.sqf"
_result <nowiki>=</nowiki> [1,2] call _fAdd</code>
|= Example 3
____________________________________________________________________________________________


| [[spawn]], [[compile]], [[preprocessFile]] |= See also
|p21= args: [[Anything]] - arguments that are passed to the function in the <sqf inline>_this</sqf> variable


}}
|p22= code: [[Code]] - [[compile]]d instructions
{{Feature|ofp|{{ofp}} takes [[String]].}}
 
|r2= [[Anything]] - the last value given in the function is returned. See the topic [[Function#Return_Values|Function]] for more information.
 
|s3= hashMapObj [[call]] [methodName, arguments]
 
|s3since= arma3 2.14
 
|p41= hashMapObj: [[HashMap]] - the HashMap (not necessarily created through [[createHashMapObject]]) to call the method on
 
|p42= methodName: [[String]] - the name of the method to call (the method must be defined in ''hashMapObj''; see [[createHashMapObject]])
 
|p43= arguments: [[Anything]] - (Optional, default [[nil]]) arguments that are passed to the method in the <sqf inline>_this</sqf> variable
 
|r3= [[Anything]] - the value returned by the ''methodName'' method
 
|x1= <sqf>call { hint str 123; };</sqf>
 
|x2= <sqf>123 call { hint str _this; };</sqf>


<h3 style="display:none">Notes</h3>
|x3= <sqf>
<dl class="command_description">
_sum = [1, 2] call { (_this select 0) + (_this select 1); };
<!-- Note Section BEGIN -->
hint str _sum; // displays 3
</sqf>


<!-- Note Section END -->
|x4= <sqf>123 call compile "hint str _this;";</sqf>
</dl>


<h3 style="display:none">Bottom Section</h3>
|x5= <sqf>_result = 123 call compile preprocessFileLineNumbers "myFile.sqf";</sqf>


|x6= <sqf>
private _hashMapObj = createHashMapObject [[
["MyMethod", { systemChat ("MyMethod has been called with the following arguments: " + str _this); }]
]];


[[Category:Scripting Commands|CALL]]
_hashMapObj call ["MyMethod", ["Hello there", player, 123]]; // hints 'MyMethod has been called with the following arguments: ["Hello there", player, 123]'
[[Category:Scripting Commands OFP 1.99|CALL]]
</sqf>
[[Category:Scripting Commands OFP 1.96|CALL]]
[[Category:Scripting Commands ArmA|CALL]]
[[Category:Scripting Commands ArmA2|{{uc:{{PAGENAME}}}}]]
[[Category:Scripting Commands Arma 3|{{uc:{{PAGENAME}}}}]]
[[Category:Scripting_Commands_Take_On_Helicopters|{{uc:{{PAGENAME}}}}]]
[[Category:Command Group: Program Flow|CALL]]


<!-- CONTINUE Notes -->
|seealso= [[spawn]] [[execVM]] [[canSuspend]] [[compile]] [[compileScript]] [[preprocessFile]] [[remoteExec]] [[remoteExecCall]]
<dl class="command_description">
}}
<dd class="notedate">Posted on July 5, 2014 - 16:00 (UTC)</dd>
<dt class="note">'''[[User:MattAka Horner|MattAka Horner]]'''</dt>
<dd class="note">
<br>
A called function may only use suspension ([[sleep]], [[uiSleep]], [[waitUntil]]) if it originates in a scheduled environment. If the called function originates in a non-scheduled environment it will return a generic error.
<br>
<code>// *** non-scheduled origin ***
[] [[spawn]] {
// *** scheduled scope ***
[] [[call]] {
// *** scheduled scope ***
[[sleep]] 3; // <- OK
[[hintSilent]] "Hello World!";
};
};
</code>


<code>// *** non-scheduled origin ***
{{Note
[] [[call]] {
|user= Leopard20
// *** non-scheduled scope***
|timestamp= 20211105105249
[] [[call]] {
|text= Contrary to a widespread misconception in the community, [[call]] doesn't necessarily execute the code in the [[Scheduler#Unscheduled_Environment|Unscheduled Environment]]. [[call|Call]] simply means: "execute the code here", just like how you execute a code using [[then]] (<sqf inline>if (true) then _code</sqf>) or [[do]]. Therefore it does not change the environment:
// *** non-scheduled scope ***
{{{!}} class="wikitable"
[[sleep]] 3; // <- NOT OK
{{!}}-
[[hintSilent]] "Hello World!";
! ''[[call]]'' executed in environment: !! Resulting environment of the code:
};
{{!}}-
};
{{!}} Scheduled {{!}}{{!}} Scheduled
</code>
{{!}}-
{{!}} Unscheduled {{!}}{{!}} Unscheduled
{{!}}}
This means that doing something like this (which is misused very often):
<sqf>
private _handle = _params spawn MY_fnc_Function;
waitUntil { scriptDone _handle };
</sqf>


<code>// *** scheduled origin ***
is not needed, because a lot of performance would be wasted compared to simply doing this:
[] [[spawn]] {
<sqf>_params call MY_fnc_Function;</sqf>
// *** scheduled scope ***
[] [[call]] {
// *** scheduled scope ***
[[sleep]] 3; // <- OK
[[hintSilent]] "Hello World!";
};
};
</code>


<code>// *** scheduled origin ***
which does the exact same thing as the previous code, except no new ''"scheduler thread"'' is created and the function executes seamlessly, plus the added performance benefit as mentioned before.<br>
[] [[call]] {
If it is necessary to execute a code in the [[Scheduler#Unscheduled_Environment|Unscheduled Environment]], one can use [[isNil]] instead:
// *** scheduled scope***
<sqf>isNil {_params call MY_fnc_Function}; // MY_fnc_Function is always executed unscheduled, regardless of the current environment</sqf>
[] [[call]] {
// *** scheduled scope ***
[[sleep]] 3; // <- OK
[[hintSilent]] "Hello World!";
};
};
</code>
</dd>
</dl>
<!-- DISCONTINUE Notes -->


<!-- CONTINUE Notes -->
or if there are no parameters, one can simply do this:
<dl class="command_description">
<sqf>isNil MY_fnc_Function</sqf>
<dd class="notedate">Posted on February 17, 2015 - 11:02 (UTC)</dd>
}}
<dt class="note">[[User:Patriot821|Patriot821]]</dt>
<dd class="note">
If the code is in non-scheduled scope and contains while-do statement, the code runs only 10000 times at the maximum, even if the statement makes infinite loop. (ARMA3 Ver. 1.38.128937)
<code>// *** non-scheduled origin ***
[] call {
// *** non-scheduled scope***
[] call {
// *** non-scheduled scope ***
_a<nowiki>=</nowiki>0;
while{_a<15000} do{
_a<nowiki>=</nowiki>_a+1;
};
hint str(_a);//10000
};
};</code>
</dd>
</dl>
<!-- DISCONTINUE Notes -->

Latest revision as of 02:07, 3 October 2023

Hover & click on the images for description

Description

Description:
Adds given set of compiled instructions to the current stack and waits for it to finish and return, provides an option to pass arguments to the executed Code. See Scheduler to learn more about how the code is executed and behaves.
Groups:
Program Flow

Syntax 1

Syntax:
call code
Parameters:
code: Code - compiled instructions
Operation Flashpoint
Operation Flashpoint takes String.
Return Value:
Anything - the last value given in the function is returned. See the topic Function for more information.

Syntax 2

Syntax:
args call code
Parameters:
args: Anything - arguments that are passed to the function in the _this variable
code: Code - compiled instructions
Operation Flashpoint
Operation Flashpoint takes String.
Return Value:
Anything - the last value given in the function is returned. See the topic Function for more information.

Syntax 3

Syntax:
hashMapObj call [methodName, arguments]
Parameters:
hashMapObj: HashMap - the HashMap (not necessarily created through createHashMapObject) to call the method on
methodName: String - the name of the method to call (the method must be defined in hashMapObj; see createHashMapObject)
arguments: Anything - (Optional, default nil) arguments that are passed to the method in the _this variable
Return Value:
Anything - the value returned by the methodName method

Examples

Example 1:
call { hint str 123; };
Example 2:
123 call { hint str _this; };
Example 3:
_sum = [1, 2] call { (_this select 0) + (_this select 1); }; hint str _sum; // displays 3
Example 4:
123 call compile "hint str _this;";
Example 5:
_result = 123 call compile preprocessFileLineNumbers "myFile.sqf";
Example 6:
private _hashMapObj = createHashMapObject [[ ["MyMethod", { systemChat ("MyMethod has been called with the following arguments: " + str _this); }] ]]; _hashMapObj call ["MyMethod", ["Hello there", player, 123]]; // hints 'MyMethod has been called with the following arguments: ["Hello there", player, 123]'

Additional Information

See also:
spawn execVM canSuspend compile compileScript preprocessFile remoteExec remoteExecCall

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
Leopard20 - c
Posted on Nov 05, 2021 - 10:52 (UTC)
Contrary to a widespread misconception in the community, call doesn't necessarily execute the code in the Unscheduled Environment. Call simply means: "execute the code here", just like how you execute a code using then (if (true) then _code) or do. Therefore it does not change the environment:
call executed in environment: Resulting environment of the code:
Scheduled Scheduled
Unscheduled Unscheduled

This means that doing something like this (which is misused very often):

private _handle = _params spawn MY_fnc_Function; waitUntil { scriptDone _handle };

is not needed, because a lot of performance would be wasted compared to simply doing this:

_params call MY_fnc_Function;

which does the exact same thing as the previous code, except no new "scheduler thread" is created and the function executes seamlessly, plus the added performance benefit as mentioned before.
If it is necessary to execute a code in the Unscheduled Environment, one can use isNil instead:

isNil {_params call MY_fnc_Function}; // MY_fnc_Function is always executed unscheduled, regardless of the current environment

or if there are no parameters, one can simply do this:

isNil MY_fnc_Function