Объявления процедур и функций Функции, это подпрограммы, возвращающие какое-либо значение. Процедуры, это подпрограммы, которые ничего не возвращают. Следующие примеры показывают объявление двух процедур; одна из них не имеет аргументов, а другая процедура получает 2 аргумента: program procedureSample; var n: integer; { эта переменная видима в главном блоке программы и во всех процедурах и функциях } procedure noArgs; begin n := 5; end; procedure twoArgs(a: integer; b: string); var len: integer; { эта переменная доступна только внутри процедуры и она переинициализируется при каждом вызове процедуры } begin len := length(b); n := a + len; end; begin noArgs; { вызываем первую процедуру } twoArgs(n, 'Some string'); { вызываем вторую процедуру } end. Функции во всём идентичны процедурам, за исключением того, что они могут возвращать значения. Следующий пример иллюстрирует использование функций в MIDletPascal: program functionSample; var result: integer; { эта простая функция всегда возвращает "5" } function returnFive: integer; begin returnFive := 5; end; function multiply(a, b: integer): integer; begin multiply := a * b; end; begin result := multiply(2, returnFive); { вызываем функцию multiply и в качестве второго параметра используем другую функцию } end. Также позволительна рекурсия: program recursionSample; var factorielOfFive: integer; function factoriel(n: integer): integer; begin if n = 1 then factoriel := 1; else factoriel := n * factoriel(n-1); end; begin factorielOfFive := factoriel(5); end. Отличия от стандартного Паскаля: · процедуры и функции не могут быть вложенными, т.е. одна функция не может быть объявлена внутри другой функции · не поддерживаются объявления параметров var MIDletPascal позволяет использовать опережающие объявления (forward declarations). Рассмотрим пример: procedure a (x: integer); begin ... b(x); ... end; procedure b(y: integer); begin ... a(y); ... end; begin a(5); end. Процедура 'a' вызывает процедуру 'b', а процедура 'b' вызывает процедуру 'a'. Когда процедура 'b' вызывает процедуру 'a', всё в порядке, потому что процедура 'a' объявлена до процедуры 'b'. Но компилятор выдаст сообщение об ошибке в процедуре 'a', потому что она вызывает ещё не объявленную процедуру. Чтобы решить данную проблему, необходимо объявить процедуру 'b' следующим образом: procedure b(y:integer); forward; { опережающее объявление показывает компилятору, что процедура 'b' будет описана где-то в коде программы } procedure a (x: integer); begin ... b(x); ... end; procedure b(y: integer); begin ... a(y); ... end; begin a(5); end.