Нетипизированные параметры

Как можно догадаться из названия, при описании нетипизированных параметров не указывается тип. Передаются они всегда по адресу - либо как константы, либо как переменные, например:

procedure P(const a, b; var y);

Есть одно важное ограничение: передать-то их можно, а вот делать с ними в подпрограмме что-либо до тех пор, пока они не приведены к какому-то определенному типу, все равно нельзя!

Пример №2.

Функция сравнения на равенство двух величин произвольного размера и типа.

Function EQ(const x, y; size : word) : boolean;

type

mas_byte = array[0 .. MaxInt] of byte;

var

n : integer;

begin

n := 0;

while (n < size) and (mas_byte(x)[n] = mas_byte(y)[n]) do

inc(n);

EQ := n = size;

end;

В эту функцию фактически передаются только адреса начала расположения в памяти двух переменных, поэтому необходим еще один параметр: длина сравниваемых величин в байтах (параметр size). Единственный способ выяснить, равны ли две величины, размер которых заранее не известен - их побайтное сравнение, поэтому оба параметра приводятся к типу mas_byte, объявленному в функции. При описании массива используется стандартная константа MaxInt, в которой хранится максимальное значение для величин типа integer, то есть 32767.

С помощью функции EQ можно сравнить две любые величины. Пусть, например, в программе описаны переменные:

var a, b : array [1 .. 10] of byte; x: real; c: string;

Следующие обращения к функции EQ будут корректны:

EQ(a, b, sizeof(a)) { сравнение двух массивов }

EQ(a[2], b[5], 4) { сравнение 2-5 элементов массива "a" с 5-8 элементами массива "b", соответственно }

 

Принцип локализации. (поискать)

Принцип локализации означает группирование логически связанных элементов; это относится к данным и этапом выполнения алгоритмов. Он реализуется через создание структур данных (массивы, записи) и программных структур типа отдельных подпрограмм или процедур

 

 

Массив как структура данных.

 

Массив – упорядоченный набор элементов одинакового типа имеющих общее имя. В памяти элементы массива располагаются последовательно. Обратится к каждому элементу массива можно по имени массива и индексу элемента.

Номер элемента массива необязательно начинается с единицы или с нуля. Комплексные числа не используются. Можно описывать массив, пронумеровав любыми целыми числами. Необходимо чтобы левая граница индекса была меньше, чем правая. Нумеровать массивы можно не только целыми типами, любой порядковый тип данных (перечисляемый, интервальный, символьный, логический), а так же любой тип, созданный на основе перечисляемого имеет право выступать в роли нумерации.

var a: array [1..N] of integer;

type <имя массива> = array [тип1..типN] of <тип>;

ab: array [-10 .. 10] of ^string – массив из указателей и строк

ab: array [1 .. 100] of array [1 .. 100] of char – массив из массивов символов

ab: array [0 .. 100] of record – массив из записей

 

Замечание: общее ограничение на размер любых массивов 65535

Строки.

 

Строки в Pascal – массивы обрабатываемые специальными процедурами и функциями, каждая ячейка такого массива представляет собой символ.

 

Шаблон описания строки:

var <имя строки>:string[n];

где n – длина строки, максимальная длина 256 символов.

 

Элементы строки нумеруется с нуля. Нулевой байт хранит длину строки.

 

Замечание: длина строки в 1 символ и 1 символ – разные вещи.

c:char ≠ s:string[1];

 

В тексте программы символы заключённые в апострофы воспринимаются как строка или как отдельный символ. В константе – строке автоматически минимальный тип данных, достаточной для её восприятия. Если константа длиннее, той строки, куда компилятор пытается её записать, то автоматически будет произведено усечение. Пустая строка задаётся двумя последовательными апострофами, если необходимо чтобы среди символов строки присутствовал сам апостроф он удваивается.

Не типизированные константы

const

c3 = '''';

s3 = 'This is a string';