ACSUtils Wiki

An ACS library for ZDoom-based ports

User Tools

Site Tools


multiple_return_values

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
multiple_return_values [2019/04/19 21:20] korshunmultiple_return_values [2019/04/22 00:32] (current) korshun
Line 1: Line 1:
-====== Multiple return values convention ======+====== Multiple return values ======
  
-Some ACSUtils functions return multiple values (e.g. [[math#vector_math|vector math functions]]). ACS doesn't support returning multiple values from a function.+Some ACSUtils functions return multiple values (e.g. [[math#vector_math|vector math functions]], but also some non-math functions). ACS doesn't support returning multiple values from a function.
  
 ACSUtils uses a convention to fake returning multiple values from a function. The convention is as follows: there are 8 global variables with names ''r1'' through ''r8''. If a function returns multiple values, it actually returns no value and writes the first "returned" value to ''r1'', the second one to ''r2'', and so on. ACSUtils uses a convention to fake returning multiple values from a function. The convention is as follows: there are 8 global variables with names ''r1'' through ''r8''. If a function returns multiple values, it actually returns no value and writes the first "returned" value to ''r1'', the second one to ''r2'', and so on.
Line 11: Line 11:
 int newX = r1; int newX = r1;
 int newY = r2; int newY = r2;
-</code> 
- 
-The following is also valid: 
-<code> 
-RotateVector(x, y, angle); 
-x = r1; 
-y = r2; 
-</code> 
- 
-''normalize3d'' returns three values: 
-<code> 
-normalize3d(x, y, z); 
-int newX = r1; 
-int newY = r2; 
-int newZ = r3; 
 </code> </code>
  
Line 47: Line 32:
 </code> </code>
 </note> </note>
 +
 +<note important>Another shortcoming is that ''r1''..''r8'' are declared ''raw'' in BCC to be able to accomodate any type of return value, and thus bypass [[strict typing]], even if it's enabled.
 +
 +<code>
 +ParseFixed("1.0", 10);
 +int error = r1;
 +int result = r2; // no compiler error, despite assigning a fixed to int
 +</code>
 +
 +</note>
 +
 +But overwriting argument variables immediately after calling the function is valid:
 +<code>
 +RotateVector(x, y, angle);
 +x = r1;
 +y = r2;
 +</code>
 +
 +An example of a function returning three values:
 +<code>
 +normalize3d(x, y, z);
 +int newX = r1;
 +int newY = r2;
 +int newZ = r3;
 +</code>
  
multiple_return_values.1555698027.txt.gz · Last modified: 2019/04/19 21:20 by korshun