<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=40431&amp;view=findpost&amp;p=279741</guid>
        <pubDate>Mon, 12 Jan 2004 17:29:32 +0000</pubDate>
        <title>Record</title>
        <link>https://forum.sources.ru/index.php?showtopic=40431&amp;view=findpost&amp;p=279741</link>
        <description><![CDATA[Пацакский бибурат: Эххх ну люблю я наглядность, что тут поделать :)<br>
А запись в записи (или, по научному - <strong class='tag-b'>вложенная</strong> запись)<br>
К примеру заменим Phone на AllPhones: Phones;<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">type</div><div class="code_line">&nbsp;Phones = record</div><div class="code_line">&nbsp;&nbsp; Home, </div><div class="code_line">&nbsp;&nbsp; Work,</div><div class="code_line">&nbsp;&nbsp; Mobile: String[10]; </div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;FriendType = record</div><div class="code_line">&nbsp;&nbsp; Name,</div><div class="code_line">&nbsp;&nbsp; Address,</div><div class="code_line">&nbsp;&nbsp; Info: String[30];</div><div class="code_line">&nbsp;&nbsp; AllPhones: Phones;</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;Friends:array [1..100] of FriendType;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;{Заполняем запись № 1}</div><div class="code_line">&nbsp;&nbsp;with Friends[1] do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Name := &#39;Вася&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Address := &#39;Речная&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;AllPhones.Home := &#39;012-21552&#39;;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end.</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>Пацакский бибурат</author>
        <category>Pascal: Структуры данных</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=40431&amp;view=findpost&amp;p=262101</guid>
        <pubDate>Fri, 12 Dec 2003 11:29:54 +0000</pubDate>
        <title>Record</title>
        <link>https://forum.sources.ru/index.php?showtopic=40431&amp;view=findpost&amp;p=262101</link>
        <description><![CDATA[vesper1: Тип-запись. Описание:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">type some_record=record</div><div class="code_line">&nbsp;&nbsp;field1:type1;</div><div class="code_line">&nbsp;&nbsp;......</div><div class="code_line">&nbsp;&nbsp;fieldN:typeN;</div><div class="code_line">end;</div></ol></div></div></div></div>Технически, запись - объединение переменных разных типов, объединенных одним смыслом (например, точка в пространстве, город, человек), в одной переменной, под одним именем. <br>
Для того, чтобы разобраться, что же за тип такой record давайте представим себе такую задачу:<br>
<br>
Допустим нам нужно создать себе программку - блокнотик, в котором были бы записаны краткие описания всех наших друзей (не больше 100 человек). Их имена, телефоны, адреса, краткое описание. На данный момент мы не знаем что такое record и будем решать эту задачу без него.<br>
<br>
Что будем делать ?<br>
Ну очевидно, что если у нас есть друзья, и их не больше ста, то будут массивы. Это ясно. Как мы будем хранить в памяти наших друзей ? Самый простой способ:<br>
Массив из 100 элементов с строками - именами друзей. Массив из 100 элементов с строками - адресами друзей. Массив из 100 элементов с цифрой - телефоном, и массив из 100 элементов с строками - кратким описанием друга.<br>
Вот например:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">var</div><div class="code_line">&nbsp;FriendName=array[1..100] of string;</div><div class="code_line">&nbsp;FriendPhone=array[1..100] of longint;</div><div class="code_line">&nbsp;FriendAddress=array[1..100] of string;</div><div class="code_line">&nbsp;FriendInfo=array[1..100] of string;</div></ol></div></div></div></div><br>
Всё это нормально. Но далеко не удобно. Посмотрите на код - в нём целых 4 одинаковых повторения - 4 одинаковых массива, с одним размером. И вот тут мы подходим к пониманию типа - record. Давайте я напишу такой пример, и мы его разберём:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">type</div><div class="code_line">&nbsp;FriendType=record</div><div class="code_line">&nbsp;&nbsp; Name:String;</div><div class="code_line">&nbsp;&nbsp; Phone:Longint;</div><div class="code_line">&nbsp;&nbsp; Address:String;</div><div class="code_line">&nbsp;&nbsp; Info:String;</div><div class="code_line">&nbsp;end;</div><div class="code_line">var</div><div class="code_line">&nbsp;Friends:array [1..100] of FreindType;</div></ol></div></div></div></div><br>
В этом примере я создал новый тип - record, и назвал его FriendType. А потом объявил массив из 100 таких элементов, под названием Friends. Мой новый тип является как бы набором всех свойств друга в одном целом. И если я объявляю какую либо переменную такого типа, то она преобетает все свойства, описанные в этом типе. В моём примере переменная Friends[1] будет иметь свойства - Name, Phone, Address, Info. Для доступа к ним нужно указать имя переменной, и через точку называние свойства. Например:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Friends[1].Name, или Friends[1].Phone и т.д.</div></ol></div></div></div></div><br>
<br>
Поля в записи располагаются последовательно в отведенной под переменную области памяти, в порядке их описания в типе. С этим связаны сложности при чтении и записи в файл, если описания типов в разных программах не совпадают по последовательности полей или различаются по описанным типам (например, длиной строки).<br>
Размер записи есть сумма размеров всех ее компонентов.<br>
Обращение к записи может быть цельным, если нужно переписать ее всю, целиком она может быть использована лишь в операторе присваивания. Обычно обращаются лишь к определенным полям, в этом случае запись выглядит как a_record.field1, где a_record - переменная типа запись, а field1 - точная запись имени поля в определении типа. Результат является выражением типа поля, т.е. типа type1. Точка между именем переменной и именем поля обязательна. Поля записи можно передавать в процедуры как параметры-переменные.<br>
Для упрощения записи длительных преобразований с использованием одной переменной типа запись в Турбо-Паскале есть оператор WITH (в стандартном Паскале его нет) со следующим синтаксисом:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">WITH var1{,var2,...,varN} DO (оператор);</div></ol></div></div></div></div>Внутри оператора под WITH можно использовать имена полей как самостоятельные переменные. Например:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;recordtype=record</div><div class="code_line">&nbsp;&nbsp; &nbsp;x:integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;y:real;</div><div class="code_line">&nbsp;&nbsp; &nbsp;s:string[6];</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">var verylongvariablename:recordtype;</div><div class="code_line">...</div><div class="code_line">with verylongvariablename do begin</div><div class="code_line">&nbsp;&nbsp;x:=trunc(pow(y,4.5))mod 4097;</div><div class="code_line">&nbsp;&nbsp;str(x,s);</div><div class="code_line">end;</div></ol></div></div></div></div>Вроде бы намного проще? НО: <span class="tag-color tag-color-named" data-value="red" style="color: red">На этом операторе особенно часто &quot;валят&quot; студентов преподаватели, так что аккуратнее с ним&#33;</span><br>
Если в программе есть переменная с именем, совпадающим с именем поля записи, то внутри оператора WITH она становится недоступной. Пример:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">type r=record</div><div class="code_line">&nbsp;&nbsp;a,b:word;</div><div class="code_line">&nbsp;&nbsp;x:real;</div><div class="code_line">end;</div><div class="code_line">var x:word;</div><div class="code_line">&nbsp;&nbsp; &nbsp;t:r;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;t.x:=1;</div><div class="code_line">&nbsp;&nbsp;x:=2;</div><div class="code_line">&nbsp;&nbsp;with t do writeln(x);</div><div class="code_line">end.</div></ol></div></div></div></div>Программа выведет значение 1 (компилятор ВР7.0).<br>
При вложении операторов WITH и совпадении полей записей в их параметрах приоритет имеет внутренняя переменная. Если указываются несколько переменных в одном операторе WITH, то при конфликте имен при обращении к спорному полю нужно указать исходную переменную (несмотря на WITH).<br>
Паскаль (начиная с Турбо 6.0, может раньше) позволяет делать в типе запись вариантную часть. Пишется это так:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">type some_record=record</div><div class="code_line">&nbsp;&nbsp;field1:type1;</div><div class="code_line">&nbsp;&nbsp;......</div><div class="code_line">&nbsp;&nbsp;fieldN:typeN;</div><div class="code_line">&nbsp;&nbsp;case (тип или объявление переменной) of</div><div class="code_line">&nbsp;&nbsp; &nbsp;value1:(объявления переменных);</div><div class="code_line">&nbsp;&nbsp; &nbsp;value2:(...);</div><div class="code_line">&nbsp;&nbsp; &nbsp;..............</div><div class="code_line">&nbsp;&nbsp; &nbsp;valueN:(....);</div><div class="code_line">end;</div></ol></div></div></div></div>При этом все объявления в одном варианте располагаются последовательно в памяти, а разные варианты - в одной, с общего смещения&#33;&#33;&#33; Таким образом, тип-запись можно использовать для &quot;полуявного&quot; преобразования типов, например можно рассматривать тип real как 6 самостоятельных байт. Размер вариантной части есть наибольший размер объявлений внутри вариантов. Если в конструкции case стоит объявление переменной, то она считается объявленной в основной части записи, ее значение никак не влияет на работу вариантной части. Значения valueX могут быть любого типа. В книге В. Фаронова приводится такая конструкция:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">type rec2=record</div><div class="code_line">&nbsp;&nbsp;c:longint;</div><div class="code_line">&nbsp;&nbsp;case x:byte of</div><div class="code_line">&nbsp;&nbsp; &nbsp;1: (d:word);</div><div class="code_line">&nbsp;&nbsp; &nbsp;2: (e: record</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case boolean of</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;3:(f:rec1); {я опустил этот тип}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;3:(g:single);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;3&#39;:(c:word)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; end)</div><div class="code_line">end;</div></ol></div></div></div></div>end стоит в записи только как признак конца описания типа, ставить его после окончания вариантной части не надо.<br>
Вывод достаточно прост: Record - тип с большими и гибкими возможностями, в то же время достаточно защищен от ошибок программиста. Поэтому он является основным типом в серьезных проектах, но до тех пор, пока не появились объекты. О них речь позже.]]></description>
        <author>vesper1</author>
        <category>Pascal: Структуры данных</category>
      </item>
	
      </channel>
      </rss>
	