parameters-mechanisme

Een stukje theorie van programmeertalen:

er wordt onderscheid gemaakt tussen formele parameters en actuele parameters. Formele parameters zijn de namen zoals deze in de procedure heading voorkomen, actuele parameters zijn de waarden zoals deze bij de aanroep gespecificeerd zijn.

Een voorbeeld in Algol60 dat waarschijnlijk voor iedereen wel duidelijk is:

 

1 procedure Voorbeeld(x, y, z);
2 begin
3 .... statements in de body van de procedure
4 end;
5
6 Voorbeeld(i+3,A[j,k],0);

Regel 1 t/m 4 vormen de procedure declaratie. x, y en z zijn de formele parameters.
Bij de aanroep op regel 6 zijn i+3, A[j,k] en 0 de actuele parameters.

Er zijn drie hoofd-methoden om een actuele parameter aan een aan te roepen procedure mee te geven:

  1. call-by-value
  2. call-by-reference
  3. call-by-name
PS. Er zijn er meer: kijk op Wikipedia.

Call-by-value

Wanneer een parameter by-value wordt doorgegeven dan wordt de waarde van de actuele parameter doorgegeven. Wanneer in de procedure er iets aan de formele parameter wordt toegekend heeft dat geen invloed op de actuele parameter.

Call-by-reference

Wanneer een parameter by-reference wordt doorgegeven dan wordt het adres van de actuele parameter doorgegeven. Wanneer in de procedure er iets aan de formele parameter wordt toegekend heeft dat wordt de actuele parameter gewijzigd.

Wanneer de actuele parameters een array-element A[i] is en de waarde van i is ondertussen gewijzigd, dan heeft dat geen invloed.

Call-by-name

De taal-definitie van Algol60 zegt dat als een parameter by-name wordt doorgegeven, ieder voorkomen van de formele parameter moet worden vervangen door de actuele parameter.

Dus als de actuele parameter A[i] is dan hangt het van de waarde van i op het moment van gebruik van de formele parameter af welk element uit het array A geadresseerd wordt.

Het zal duidelijk zijn dat dit een heel zwaar mechanisme is. In de Algol60-implementaties die ik ken wordt dit gedaan door als actuele parameters een functie mee te geven die een adres retourneert. Ieder gebruik van de formele parameter houdt dus een aanroep van die functie in.
Jensen's device maakt gebruik van de mogelijkheid van call-by-name. Wikipedia biedt hier informatie over.

Toepassing in verschillende programmeertalen

Algol

Algol kent by-value en by-name.
Wanneer een procedure een zgn. output-parameter heeft (een variabele waarin een waarde moet worden afgeleverd) dan moet die by-name worden doorgegeven. Array's kunnen by-name en by-value meegegeven worden.
De procedure-declaratie bepaalt of een parameter by-name of by-value moet worden doorgegeven.

Fortran

Standaard is by-reference. De aanroeper moet zorgen dat er een dummy argument wordt gemaakt als hij by-value wil.
Array's kunnen alleen by-reference meegegeven worden.

Cobol

Kent alleen by-value.

Pascal

Kent by-value en by-name. Wordt door de procedure-declaratie bepaald.

C

De taal C kent alleen by-value. By-reference moet worden gerealiseerd door de formele parameter niet als <type> te declareren maar als <type> * (i.e. een pointer naar iets van type <type>)
Array's worden via pointers doorgegeven.

C++

C++ kent by-value cf. C maar ook de mogelijkheid om een formele parameter als referentie de declareren. C++ kent zelfs de mogelijkheid om een functie een referentie op te laten leveren zodat aan een functie-aanroep iets toegekend kan worden. Bijv.

  int & kleinste(int & a, int & b, int &  c)
// int & staat voor een referentie naar een int


....
kleinste(I,J,K)=0; // zet de kleinste op 0