Компонентный Паскаль/Введение в записи: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
Нет описания правки
Строка 1:
__NOEDITSECTION__
__TOC__
:<div>
==Понятие записи==
</div>
Записи в КП не являются записями как в обыкновенной жизни, но тем не менее, имеют нечто похожее. Записям в жизни всё-равно, какого цвета ручка (или может быть это карандаш, фломастер). Не важно где выполнена запись -- на обрывке листа, полях газеты или тетрадке. Ценность в записи -- её содержимое. Поэтому, запись -- это ''сущность'', определяющая какую-то информацию. Можно считать, что запись -- это особый вид файла. Но в отличии от файла, которому безразлично, что в него записали, у записи есть чёткое разделение ''полей'', например:
:<div>
* Фамилия
</div>
* Имя
:<div>
* Отчество
</div>
* Адрес
:<div>
* Телефон
</div>
В какой-то записи, например, нет отчества, в другой -- нет телефона, но есть общее правило: все записи состоят из ''полей''. Поля могут быть даже не заполненными, но ''они есть''. Очень удобно, когда один раз описав поля записи, можно создать массив записей. Примерно так создаются ''базы данных'' (хотя надо понимать, что базы данных шагнули очень далеко, по сравнению с простым набором записей). Можно, конечно, хранить различные фамилии в одном массиве, а имена в другом массиве, а телефоны в третьем массиве, и собирать эти данные по общему индексу для всех массивов, но гораздо более красивое решение -- хранить все эти переменные в одной записи в виде полей. Записи используются на столько широко, у них на столько обширные возможности, что в одной глав осветить охватить всё просто не получится.
<div style="width:100%; height:100%; position:fixed; top:0; text-align:center; background-color:white; left:0; z-index:9000; font-size:127%; vertical-align:top; font-family:serif">
<div style="font-size:127%;">
<div style="font-weight:bold;font-family:serif;font-size:24px;line-height:29px;text-align:center;vertical-align:baseline;margin-top:16.0833px;margin-bottom:16.0833px;position:static;display:block;visibility:visible;z-index:auto;overflow-x:visible;overflow-y:visible;white-space:normal;clip:auto;float:none;clear:none;-moz-box-sizing:content-box;cursor:auto;list-style-image:none;list-style-position:outside;list-style-type:disc;marker-offset:auto">Дети, расскажу вам сказку, как смотров насрал в коляску и поставил в уголок, чтоб никто не уволок</div>
<hr />
))0
 
</div>
==Пример записи==
</div>
В тексте модуля, который приведён ниже, представлено объявление одно записи с несколькими полями:
<div class="mw-parser-output"><p>Antispam</p></div>
<source lang="oberon2">
[[Категория:Смотризм]]
MODULE TestHello07;
(* Этот пример показывает как объявлять
записи *)
IMPORT Log, Math;
VAR
r : RECORD
CoordX, CoordY : INTEGER;
Enabled : BOOLEAN;
Color : ARRAY 3 OF INTEGER;
END;
PROCEDURE Start*;
VAR
BEGIN
END Start;
BEGIN
END TestHello07.
</source>
В секции VAR модуля объявлена переменная "r" с ключевым словом RECORD. Это не тип данных, это указатель на то, что переменная является точкой входа для записи. В самой записи могут быть любые поля любого типа, в неограниченном количестве (конечно, учитывая размер свободной памяти и разумность попытки разместить всё под одним объявление RECORD). Более того, в запись может быть включена другая запись, в которую может быть включена другая запись, в которую...
 
Описание полей в записи разделяются точкой с запятой, а само объявление записи традиционно ограничивается ключевым словом END;
 
 
==Обращение к полям записи==
Обращение к полям записи происходит точно также, как и к простой переменной. Обращение к элементу массива в записи, в сущности, ничем не отличается от обращения к элементу простого масcива. Единственное отличие, перед полем записи должно быть указано имя соответствующей переменной с типом RECORD и подряд символ "." ("точка"). Пример такого обращения к записи:
 
 
Hello07.odc
<source lang="oberon2">
MODULE TestHello07;
(* Этот пример показывает как объявлять
записи *)
 
IMPORT Log, Math;
VAR
r: RECORD
coord_x, coord_y: INTEGER;
enabled: BOOLEAN;
color: ARRAY 5 OF INTEGER
END;
 
PROCEDURE Start*;
VAR
i: INTEGER;
BEGIN
r.coord_x := 5;
r.coord_y := 4;
Log.Int(r.coord_x); Log.String(', ');
Log.Int(r.coord_y); Log.Ln;
r.color[0] := 4;
r.color[4] := - 10;
FOR i := 0 TO 4 DO
Log.Int(r.color[i]); Log.String(', ')
END;
Log.Ln
END Start;
 
BEGIN
END TestHello07.
</source>
В этом примере присваиваются значения полям "coord_x" и "coord_y". В массиве "color" элементам с номерами 0 и 4 также присваиваются значения. Обратите внимание, на именование полей -- все они с маленькой буквы. В записях могут быть ''ссылки'' на процедуры, а процедуры должны именоваться с большой буквы (а иначе отличить одно от другого без чтения документации, либо исходных кодов -- будет тяжело). Если всё сделано правильно, то будет получен такой вывод:
<source lang="dos">
компилируется "TestHello07" 156 32
старый модуль TestHello07 выгружен
5, 4
4, 0, 0, 0, -10,
</source>
из которого можно сделать вывод, что действительно поля записи меняют свои значения.
 
==Заключение==
Это коротенькое введение очень важно. Так как Компонентный Паскаль очень сильно приспособлен под использование записей в связи с его подходом к построению программ. Пользоваться записями впереди предстоит часто.
{{BookCat}}