Parametry domyślne

Dryobates

Delphi udostępnia nam możliwość tworzenia funkcji z domyślnymi parametrami.

Na pewno spotkaliście się już z funkcjami opisanymi w pomocy w ten sposób:

procedure BlockRead(var F: File; var Buf; Count: Integer [; var AmtTransferred: Integer]);

i wiecie, że parametry w nawiasach kwadratowych są opcjonalne. Jak my możemy zrobić takie funkcje?

Bardzo prosto. Musimy zadeklarować funkcję tak, żeby w razie braku ostatnich parametrów funkcja miała jakieś zastępcze, domyśne parametry.
A o to jak to się robi:

function Pierwiastek(Liczba: Extended; Stopien: Byte = 2): Extended;

W ten sposób zadeklarowaliśmy funkcję, która zwraca pierwiastek z Liczba. Jeżeli funkcję wywołamy w ten sposób:

Wartosc := Pierwiastek(64); // Wartosc = 8

To otrzymamy pierwiastek kwadratowy (zwykle mówiąc pierwiastek mamy na myśli pierwiastek drugiego stopnia).
Jeżeli natomiast wywołamy funkcję w ten sposób:

Wartosc := Pierwiastek(64, 3); // Wartosc = 4

Trzeba jednak uważać na kilka rzeczy. Tak jak przy domyślnym inicjowaniu zminnych globalnych w projekcie (var Zmienna: Byte = 12) tak i tu nie można zainicjować wielu zmiennych, jeżeli są na liście.

Deklaracja:

function Przeciwprostokątna(X: Single = 4.0; Y: Single = 4.0): Single;

jest poprawna, ale ta:

function Przeciwprostokątna(X, Y: Single = 4.0): Single;

już niestety nie. Nie mamy wyjścia. Trzeba więcej popisać.

Drugi haczyk to to, że domyślne wartości muszą pojawiać się na końcu listy parametrów. Taka konstrukcja jest błędna:

function Pierwiastek(Stopien: Byte = 2; Liczba: Extended): Extended;

Jeżeli określimy typ proceduralny, to domyślne wartości w nim określone nadpisują wartości w aktualnej funkcji. Np.

type TPierwiastek = function (Liczba: Extended; Stopien: Byte = 3): Extended;

function Pierwiastek(Liczba: Extended; Stopien: Byte = 2): Extended;

var
  F: TPierwiastek;
  Podstawa: Extended;

F := Pierwiastek;

F(Podstawa);

W wyniku działania tej funkcji przekazane zostaną wartości (Podstawa, 3) do funkcji.

I ostatnie ograniczenie. Typy jakie mogą być przekazywane jako parametry domyślne są ograniczone do tych, które mogą być przekazywane jako wyrażenia stałe. Czyli parametry typu tablice dynamiczne, typów proceduralnych, klasy, referencje klas, interfejsy mogą być zadeklarowane jako domyślne tylko wówczas gdy domyślną wartością jest nil. Parametry typu rekordy, typy wariantowe, pliki, tablice statyczne lub obiekty nie mogą być w ogóle przekazywane jako parametry domyślne.

5 komentarzy

You23 - delphi jest wyposażony w czytnik myśli, odczytuje je z tęczówki, za pośrednictwem monitora....

Bardzo fajnie. A ty You23 - przypominasz mi pewna Karoline (wiekszosc bedzie wiedziec o co chodzi ;-) )

chyba rzeczywiście jesteś za głupi (bez obrazy), chodzi o to, że gościu daje przykład i to on napisał dla przykładu funkcję o nazwie pierwiastek :)

fajny artykul ale ale ale ...... skad kompilator wie ze chodzi o pierwiastek, a nie np mnozenie, czy dodawanie. Czy artykul dotyczy spolszczonej wersji czy jak?????jestem za glupi (chyba) na programowanie....

Fajny artykulik!