Головним результатом дії функції є значення. На відміну він процедури, кожна функція обов’язково має фіксований тип результату.
Наприклад, якщо звернутись до стандартних функцій, то функція sin має дійсне значення, strtoint – ціле, floattostr – рядкове.
Розглянемо загальний вигляд функції:
function ім'я_функції(опис параметрів) : тип;
блок опису локальних констант, змінних, типів;
Begin
послідовність операторів;
ім’я_функції := остаточне_значення_функції;
end;
Зазначимо, що остаточне_значення_функції має бути того ж типу, що і сама функція.
Наприклад:
function extent (a:real; b:integer; var bb:boolean): real;
var
s:real;
begin
s:=exp(b*ln(a));
bb:=true;
extent:=s;
end;
Функція extent має 3 параметри, які передаються їй керуючою програмою, модулем чи іншою підпрограмою. Перші два параметри a та b (дійсний та цілий) передаються у функцію для використання, причому їх значення функцією не повертаються у батьківську підпрограму (тобто підпрограму, звідки викликається ця функція). Третій же параметр (булевського або логічного типу) також використовується у функції, але його значення повертається до батьківської підпрограми.
Тому допустимими є виклики цієї функції
var
i, j: integer;
ab : boolean;
s1, s2, s3 : real;
…
ab:=false;
s1:=extent (1.5, 3, ab);
s2:=4.5;
i:=3;
s1:=extend(s2, i, ab);
...
і недопустимими
...
s1:= extent (1.5, 3, false);
...
Недопустимість виклику виникає з того, що після виконання усіх операторів функції extent у батьківську підпрограму передається крім самого значення функції ще й значення параметру (у нашому випадку це третій параметр bb:boolean), яке не може передатись через те, що третім параметром виступає не змінна, а її значення.