тип запись

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Amorf
незнакомец
Сообщения: 8
Зарегистрирован: 07.01.2013 13:30:23

тип запись

Сообщение Amorf »

В free pascal имеют место процедурные параметры, где имя вызываемой функции, процедуры указываются в переменной.
при написании своего движка для БД, столкнулся с следующей трудностью-оказывается подобным образом нельзя указать имя записи.
например код:

Код: Выделить всё

type
   TShape = (tablica, pole, stroka, yacheyka, spisok);
   zapisBYF = record
      name : shortstring;
      case _variant : TShape of
      tablica : (_t : record
                         indexVpole, dlina, shirina : word; razmer : word
                      end);
      pole : (_p : record
                      razmer : word
                   end);
      stroka : (_s : record
                        indexVpole : word
                     end);
      yacheyka : (_y : record
                          indexVpole : word;
                          kratcoeOpisanie : shortstring
                       end);
      spisok : (_k : record
                        indexVpole, razmer : word
                     end);
      end;

где обращения к полю нужно делать так:

Код: Выделить всё

rec._k.indexVpole
а хотелось бы нечто в роде

Код: Выделить всё

rec.переменная_имени_записи.indexVpole
как можно это сделать или к какому другому приёму прибегнуть? заранее благодарен.
Последний раз редактировалось Amorf 29.03.2013 12:30:04, всего редактировалось 1 раз.
Аватара пользователя
vada
энтузиаст
Сообщения: 691
Зарегистрирован: 14.02.2006 12:43:17

Сообщение vada »

Парсер сломался. Можно как-то с запятыми разобраться?
Amorf
незнакомец
Сообщения: 8
Зарегистрирован: 07.01.2013 13:30:23

Сообщение Amorf »

всмысле? подробнее можно суть впроса? сколько запятых у вас вызвало трудности?
Аватара пользователя
vada
энтузиаст
Сообщения: 691
Зарегистрирован: 14.02.2006 12:43:17

Сообщение vada »

Три
В free pascal имеют место процедурные параметры, где имя вызываемой функции, процедуры указываются в переменной.
Amorf
незнакомец
Сообщения: 8
Зарегистрирован: 07.01.2013 13:30:23

Сообщение Amorf »

аа. сори, да русский язык он такой :), замечателен тем, что говорить можно, но единственным понимающим может оказаться только сам говорящий. имеют место процедурные параметры, с помощью которых имя вызываемой функции или процедуры указываются в специальной переменной.
Аватара пользователя
bormant
постоялец
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Сообщение bormant »

Можно использовать анонимный селектор, но тогда поля должны иметь уникальные имена -- обращение короче, но провокация ошибок при использовании выше:

Код: Выделить всё

type
  TRec = record
    Name: ShortString;
    Index: Word;
    Size: Word;
    _variant: TShape;
    case Integer of
    0: (TableWidth, TableHeight: word);
    1: (ShortDescr: ShortString);
    ...
  end;
...
v.TableWidth
Аватара пользователя
vada
энтузиаст
Сообщения: 691
Зарегистрирован: 14.02.2006 12:43:17

Сообщение vada »

Понял. :D
По мне использование селекторов в RECORD есть злобное зло.
Я бы забил на существование такой конструкции как RECORD, и посмотрел бы в сторону CLASS. И гибче и прозрачнее.
Amorf
незнакомец
Сообщения: 8
Зарегистрирован: 07.01.2013 13:30:23

Сообщение Amorf »

bormant писал(а):Можно использовать анонимный селектор, но тогда поля должны иметь уникальные имена -- обращение короче, но провокация ошибок при использовании выше:

Код: Выделить всё

type
  TRec = record
    Name: ShortString;
    Index: Word;
    Size: Word;
    _variant: TShape;
    case Integer of
    0: (TableWidth, TableHeight: word);
    1: (ShortDescr: ShortString);
    ...
  end;
...
v.TableWidth

спасибо, но мне не понять как я могу использовать это из программы. можно подробнее? про вот эти целые числа. кроме того вы сделали поле размер обязательным даже для ячейки, а она и так является самым большим элементом, которому нужен только индекс

Добавлено спустя 2 минуты 55 секунд:
vada писал(а):Понял. :D
По мне использование селекторов в RECORD есть злобное зло.
Я бы забил на существование такой конструкции как RECORD, и посмотрел бы в сторону CLASS. И гибче и прозрачнее.

я ещё новичёк, посмотрю попозжу, сейчас я просто не смогу осмыслить это, из-за специфики интерпретации парадигмы ОПП, уж очень они любят приёмы программирования выдавать за неотъемлемую часть ООП.
Аватара пользователя
bormant
постоялец
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Сообщение bormant »

Amorf писал(а):спасибо, но мне не понять как я могу использовать это из программы. можно подробнее? про вот эти целые числа.
Целые числа не используются никак, кроме того, что являются лишь синтаксическим способом задать запись с вариантами. На самом деле, вне зависимости от того, есть поле селектора или нет, это касается только программиста, но не компилятора и генерируемого им кода. Если v._variant равен pole, но несмотря на это используется обращение к полям иного варианта, например, tablica (v._t.dlina или v.TableLength), то такой код будет и скомпилирован, и выполнен без предупреждений, контроль правильной интерпретации данных целиком на плечах программиста.
Amorf писал(а):кроме того вы сделали поле размер обязательным даже для ячейки, а она и так является самым большим элементом, которому нужен только индекс
На данном этапе мне не известны варианты предполагаемого применения (кроме того, что речь о БД), поэтому пример касался только синтаксиса. Но если интересно мое мнение, прежде чем писать свою СУБД, посмотрите на что-нибудь существующее, например на тот же формат DBF. По пробуйте корректно реализовать основные операции: чтение/добавление/удаление/вставку/упаковку, затем индексы. Этот путь многие уже проходили не единожды, основные преимущества/недостатки разных подходов давно известны. Имея подобный опыт, можно будет попытаться сделать что-то принципиально отличающееся. Могу ошибаться, но ваш тип данных пока представляется жутко неоптимальным как с точки зрения дискового хранения, чтения/записи, так и хранения в памяти.
Ответить