Parametry o niezdefiniowanym typie


Można pominąć specyfikację typu parametru podczas deklaracji parametrów z użyciem słów kluczowych var, const i out. (Parametry przekazywane przez wartość muszą mieć określony typ.) Na przykład, zapis:

 procedure proc(const C);

deklaruje procedurę proc, która akceptuje parametr dowolnego typu. W wywołaniu takiej procedury, nie można zamieszczać jako parametru aktualnego numerału (liczby) ani numerycznej stałej niezdefiniowanego typu.

Wewnątrz procedury/funkcji parametry o niezdefiniowanym typie są niekompatybilne z każdym typem. Aby operować na takich parametrach należy dokonać rzutowania typu.

Kompilator nie może weryfikować poprawności operacji wykonywanych na parametrze o niezdefiniowanym typie.

W przykładzie, funkcja Equal porównuje wyspecyfikowaną liczę bajtów dwóch zmiennych.

function Equal( Size: Integer; var Source, Dest): Boolean;
type TBytes = array[0..MaxInt - 1] of Byte;
var N: Integer;
begin
  N := 0;
  while (N < Size) and (TBytes(Dest)[N] = TBytes(Source)[N]) do
    Inc(N);
  Equal := N = Size;
end;

Mając dane deklaracje:

type
  TVector = array[1..10] of Integer;
  TPoint = record
             X, Y: Integer;
           end;
var        
  Vec1, Vec2: TVector;
  N: Integer;
  P: TPoint;

można dokonać następujących porównań funkcją Equal:

 Equal(Vec1, Vec2, SizeOf(TVector))             
 // porównanie Vec1 i Vec2
 Equal(Vec1, Vec2, SizeOf(Integer) * N)         
 // porównanie pierwszych N elementów Vec1 i Vec2
 Equal(Vec1[1], Vec1[6], SizeOf(Integer) * 5)   
 // porównanie pierwszych 5 i ostatnich 5 el. Vec1
 Equal(Vec1[1], P, 4)                           
 // porównanie Vec1[1] i P.X oraz Vec1[2] i P.Y