тип запись

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

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

тип запись

Сообщение Amorf » 29.03.2013 10:03:35

В 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 раз.
Amorf
незнакомец
 
Сообщения: 8
Зарегистрирован: 07.01.2013 13:30:23

Re: тип запись

Сообщение vada » 29.03.2013 10:35:25

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

Re: тип запись

Сообщение Amorf » 29.03.2013 12:27:16

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

Re: тип запись

Сообщение vada » 29.03.2013 12:35:08

Три
В free pascal имеют место процедурные параметры, где имя вызываемой функции, процедуры указываются в переменной.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: тип запись

Сообщение Amorf » 29.03.2013 12:36:58

аа. сори, да русский язык он такой :), замечателен тем, что говорить можно, но единственным понимающим может оказаться только сам говорящий. имеют место процедурные параметры, с помощью которых имя вызываемой функции или процедуры указываются в специальной переменной.
Amorf
незнакомец
 
Сообщения: 8
Зарегистрирован: 07.01.2013 13:30:23

Re: тип запись

Сообщение bormant » 29.03.2013 13:57:14

Можно использовать анонимный селектор, но тогда поля должны иметь уникальные имена -- обращение короче, но провокация ошибок при использовании выше:
Код: Выделить всё
type
  TRec = record
    Name: ShortString;
    Index: Word;
    Size: Word;
    _variant: TShape;
    case Integer of
    0: (TableWidth, TableHeight: word);
    1: (ShortDescr: ShortString);
    ...
  end;
...
v.TableWidth
Аватара пользователя
bormant
постоялец
 
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Re: тип запись

Сообщение vada » 29.03.2013 16:24:31

Понял. :D
По мне использование селекторов в RECORD есть злобное зло.
Я бы забил на существование такой конструкции как RECORD, и посмотрел бы в сторону CLASS. И гибче и прозрачнее.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: тип запись

Сообщение Amorf » 29.03.2013 16:54:17

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. И гибче и прозрачнее.

я ещё новичёк, посмотрю попозжу, сейчас я просто не смогу осмыслить это, из-за специфики интерпретации парадигмы ОПП, уж очень они любят приёмы программирования выдавать за неотъемлемую часть ООП.
Amorf
незнакомец
 
Сообщения: 8
Зарегистрирован: 07.01.2013 13:30:23

Re: тип запись

Сообщение bormant » 29.03.2013 22:43:35

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


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 252

Рейтинг@Mail.ru