Difference between revisions of "Variable parameter"

From Lazarus wiki
Jump to navigationJump to search
m (→‎Implementation: Fix typos)
(8 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{MenuTranslate| page=Variable parameter}}
+
{{LanguageBar}}
  
'''Variable parameter''' (or Reference Parameter) is an ''input and output parameter''
+
A '''variable parameter''' is a [[Routine|routine]] parameter that is a [[Variable|variable]].
meaning it can be used for passing a value to a [[Function|function]] or [[Procedure|procedure]],
+
To call a routine with a variable parameter, you need to specify a variable at the proper position.
as well as to get back a value from a function or procedure. It is indicated by the use
+
The variable will (temporarily) be in the scope of the routine through the parameter’s name.
of the [[Keyword|keyword]] [[Var|var]] in front of the formal parameter.
 
  
A variable parameter can be considered a nickname to the actual argument given by the calling routine. When a procedure or function changes the value of a variable parameter they are actually changing the variable in the code that called the function or procedure.
+
== Usage ==
  
 +
A variable parameter is declared by preceding a formal parameter declaration with the [[Var|keyword <syntaxhighlight lang="pascal" inline>var</syntaxhighlight>]].
  
=== XOR swap ===
+
<syntaxhighlight lang="pascal" highlight="1">
 +
procedure xorSwap(var left, right: integer);
 +
begin
 +
left := left xor right;
 +
right := left xor right;
 +
left := left xor right;
 +
end;
 +
</syntaxhighlight>
 +
 
 +
Variable parameters can serve as both input and output, meaning they can be used for passing a value ''to'' a routine, ''and'' getting a value ''from'' it.
 +
After <syntaxhighlight lang="pascal" inline>procedure xorSwap</syntaxhighlight> has been called the variables ''at the call site'' will have changed.
 +
[[Becomes|Assignments]] to variable parameters have an effect in the scope where the routine is called.
 +
Thus, a variable parameter can be considered as an alias for the actual argument given by the calling routine.
 +
When a routine changes the value of a variable parameter, it is actually changing the variable in the code that called the routine.
  
<syntaxhighlight>
+
Since a variable parameter may appear on the left hand side of an assignment, only ''variables'' may be supplied as arguments when calling the routine, never [[Constant|constants]] or [[expression|expressions]].
 +
{{Note|[[File|<syntaxhighlight lang="pascal" inline>file</syntaxhighlight>]] and [[Text|<syntaxhighlight lang="pascal" inline>text</syntaxhighlight>]] variables always have to be declared as variable parameters.}}
  
  procedure XorSwap( var i,j:integer );
+
With [[GNU Pascal]] and Free Pascal, variable parameters may have no associated [[Data type|data type]] (FPC [internally] calls this “formal type”).
  begin
+
Such parameters do not allow any operations on them, but [[Typecast|typecasting]] has to be used.
    i := i xor j ;
+
Only the [[@|<syntaxhighlight lang="delphi" inline>@</syntaxhighlight>-address-operator]] is available:
    j := i xor j ;
 
    i := i xor j ;
 
  end;
 
  
 +
<syntaxhighlight lang="pascal" highlight="1,3">
 +
procedure printAddress(var x);
 +
begin
 +
write(sysBackTraceStr(@x));
 +
end;
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== OrderSmallBig ===
+
== Implementation ==
 +
 
 +
The specific implementation of variable parameters is only of concern for those who are programming (pure) assembler routines.
  
<syntaxhighlight>
+
In [[FPC]], variable parameters are implemented by passing a reference to the variable at the call site (call by reference).
 +
For this reason, variable parameters are also referred to as ''reference parameters''.
 +
If a routine is [[Inline|inlined]], the extra level of indirection is eliminated.
  
  procedure OrderSmallBig( var a,b:integer );
+
{{Note|In order to pass an address to the routine, all parameters have to be addressable (by ''one'' address).
  begin
+
Although a [[Property|<syntaxhighlight lang="delphi" inline>property</syntaxhighlight>]] may be readable ''and'' writable, it does not have a single address in one memory block, thus it cannot be used as a variable parameter.}}
    if a > b then XorSwap( a, b );
 
  end;
 
  
</syntaxhighlight>
+
== See also ==
 +
* [https://freepascal.org/docs-html/current/ref/refsu64.html § “Variable Parameters” in the FPC Reference Guide]
 +
* [[Out|<syntaxhighlight lang="delphi" inline>out</syntaxhighlight>]] designates a parameter as non-readable, only writable
 +
* [[Constref|<syntaxhighlight lang="delphi" inline>constRef</syntaxhighlight>]]
  
== Read more ==
+
[[Category:Pascal]]
* [http://lazarus-ccr.sourceforge.net/fpcdoc/ref/refsu48.html Variable parameter]
 
* [[Xor|xor]]
 
* [[Var|var]]
 
* [[Out|out]]
 
* [[If|if]]
 

Revision as of 01:51, 30 October 2020

English (en) español (es) suomi (fi)

A variable parameter is a routine parameter that is a variable. To call a routine with a variable parameter, you need to specify a variable at the proper position. The variable will (temporarily) be in the scope of the routine through the parameter’s name.

Usage

A variable parameter is declared by preceding a formal parameter declaration with the keyword var.

procedure xorSwap(var left, right: integer);
begin
	left := left xor right;
	right := left xor right;
	left := left xor right;
end;

Variable parameters can serve as both input and output, meaning they can be used for passing a value to a routine, and getting a value from it. After procedure xorSwap has been called the variables at the call site will have changed. Assignments to variable parameters have an effect in the scope where the routine is called. Thus, a variable parameter can be considered as an alias for the actual argument given by the calling routine. When a routine changes the value of a variable parameter, it is actually changing the variable in the code that called the routine.

Since a variable parameter may appear on the left hand side of an assignment, only variables may be supplied as arguments when calling the routine, never constants or expressions.

Note-icon.png

Note: file and text variables always have to be declared as variable parameters.

With GNU Pascal and Free Pascal, variable parameters may have no associated data type (FPC [internally] calls this “formal type”). Such parameters do not allow any operations on them, but typecasting has to be used. Only the @-address-operator is available:

procedure printAddress(var x);
begin
	write(sysBackTraceStr(@x));
end;

Implementation

The specific implementation of variable parameters is only of concern for those who are programming (pure) assembler routines.

In FPC, variable parameters are implemented by passing a reference to the variable at the call site (call by reference). For this reason, variable parameters are also referred to as reference parameters. If a routine is inlined, the extra level of indirection is eliminated.

Note-icon.png

Note: In order to pass an address to the routine, all parameters have to be addressable (by one address). Although a property may be readable and writable, it does not have a single address in one memory block, thus it cannot be used as a variable parameter.

See also