Il peut être nécessaire pour certaines fonctions de renvoyer plus d'une seule valeur. C'est possible en renvoyant un vecteur de valeurs mais souvent il est pratique d'utiliser le passage d'une référence à une variable. Vous transmettez une référence vers une variable à une fonction et la fonction attribue des valeurs à la variable pour vous en utilisant un déréférencement. Ce n'est pas le seul usage que vous pouvez faire du passage par référence mais c'est son utilisation principale.
When using functions that return values through references
in the argument list, just pass the variable name with an ampersand.
For example the following code will compute an eigenvalue of a matrix
A with initial eigenvector guess
x, and store the computed eigenvector
into the variable named v:
RayleighQuotientIteration (A,x,0.001,100,&v)
Les détails concernant le fonctionnement des références et leur syntaxe sont similaires à ceux du langage C. L'opérateur & référence une variable et * la déréférence. Les deux ne peuvent s'appliquer que sur un identifiant, par conséquent **a n'est pas une expression légale en GEL.
References are best explained by an example:
a=1;
b=&a;
*b=2;
now a contains 2. You can also reference functions:
function f(x) = x+1;
t=&f;
*t(3)
gives us 4.
The first time a variable is referenced, it is created in the current
context unless it exists. So if we make a function that sets the variable to 2,
such as
function f(k) = (*k=2), then the
call
f(&n) will declare a new variable n
then the function
f will run and set it to 2. So there is
no need to write something like
n=0;f(&n). A new variable in the current
context is created even if a
variable exists in a higher context, such as in the global context.
So for example after
n=3;
function f(k) = (*k=2);
function g() = (f(&n);print(n));
g();
the variable n is still 3 and not 2. That is because inside
g, when n is referenced, it is a new
variable in the context of g. The function
f then sets this n to 2,
and then 2 is printed, but the n in the global context
is not touched. So we can use references to get values out of functions and
we do not need to explicitly declare them, nor do we have to worry about messing up
global variables that the user might be using for something else.