Свой тип (класс) с некоторым завихом.

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

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

Re: Свой тип (класс) с некоторым завихом.

Сообщение vitaly_l » 28.09.2017 12:55:58

tema писал(а):Примерчик бы использования..

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

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };

type
    TSomeRecord = record
        case boolean of
            false: (valint: integer);
            true: (valint64: int64);
    end;

var
SomeRecord : TSomeRecord;

begin
SomeRecord.valint    := 1;
//SomeRecord.valint64  := 1; // <== !
writeLn( SomeRecord.valint );
writeLn( SomeRecord.valint64 );

//SomeRecord.valint   := 11;  // <== !
SomeRecord.valint64  := 11;
writeLn( SomeRecord.valint );
writeLn( SomeRecord.valint64 );

readLn;

end.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3042
Зарегистрирован: 31.01.2012 16:41:41

Re: Свой тип (класс) с некоторым завихом.

Сообщение wadman » 28.09.2017 16:03:32

tema писал(а):В турбопаскале такого точно нет.

Да ладно? Я таким пользовался часто в турбе:
Код: Выделить всё
type
    TWordRecord = record
        case boolean of
            true: (val: word);
            false: (lo: byte; hi: byte);
    end;   

Когда нужно было разложить слово в байты или получить доступ к верхнему или нижнему байту.
Код: Выделить всё
var w: word;
  l: byte;
begin
  w := 1234;
  l := TWordRecord(w).lo;
 


Добавлено спустя 20 минут 49 секунд:
Хотя, наверное, там не хватает packed
wadman
новенький
 
Сообщения: 59
Зарегистрирован: 18.10.2016 15:54:28

Re: Свой тип (класс) с некоторым завихом.

Сообщение serbod » 28.09.2017 16:42:43

:!: Не советую использовать record-case кроме как для совместимости с библиотеками на C/C++
Аватара пользователя
serbod
постоялец
 
Сообщения: 185
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Свой тип (класс) с некоторым завихом.

Сообщение gvido » 28.09.2017 17:24:34

Общий смысл изобретаемого класса такая:
1 есть несколько групп обработки файлов. Эти группы планирую запихнуть в массив.
2 каждый элемент группы имеет два направления (True/false)
3 Каждое направление является массивом элементов содержащих одинаковый набор атрибутов (маска файлов, характеристики для обработки и т.д.) и являющийся наследником потока
4 В каждом элементе есть атрибут список файлов найденных по маске в текущем цикле потока.

Ну... как-то так.

Знаю, знаю.. Я как всегда изобретаю велосипед. :)
gvido
постоялец
 
Сообщения: 174
Зарегистрирован: 28.03.2012 11:35:31

Re: Свой тип (класс) с некоторым завихом.

Сообщение wadman » 28.09.2017 17:39:58

serbod писал(а):Не советую использовать record-case кроме как для совместимости с библиотеками на C/C++

У нас-же клуб джентльменов, поэтому мы все друг другу верим на слово. :mrgreen:
wadman
новенький
 
Сообщения: 59
Зарегистрирован: 18.10.2016 15:54:28

Re: Свой тип (класс) с некоторым завихом.

Сообщение Лекс Айрин » 28.09.2017 18:01:10

gvidoА разве для этого не подойдут обычные объекты?
Создаешь базовый объект типа, условно, маска. От него порождаешь 2 объекта маска1, маска2.

В классе создаешь поле-ссылку на базовый объект(класс) маска.
В конструкторе типа Create (... SelectMask:boolean) присваиваешь потомка одного из типов. Присваивание вполне валидно. Причем, ты, в зависимости от необходимости можешь вполне нормально переключать маски динамически даже не пересоздавая основной объект, а только гася и запуская объекты маски.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4017
Зарегистрирован: 19.02.2013 16:54:51

Re: Свой тип (класс) с некоторым завихом.

Сообщение gvido » 28.09.2017 18:25:24

Лекс Айрин писал(а):А разве для этого не подойдут обычные объекты?

Возможно и подойдут. Допилю конструкцию и выложу на суд, критику.
Я и так все это время пользовался стандартными объектами и этого для моих задач хватало с головой.
Я в прошлом году только дошел до необходимости использовать потоки в первом моем сервисе. Тут народ мне еще помогал допилить класс.
Кривенько получилось, но уже почти год работает. :)
gvido
постоялец
 
Сообщения: 174
Зарегистрирован: 28.03.2012 11:35:31

Re: Свой тип (класс) с некоторым завихом.

Сообщение Лекс Айрин » 28.09.2017 18:48:45

gvido, Я только переделав свою прогу в многооконную понял как много в ней было логических глюков. Накручивание рекорда/поля селектора и, соответственно, добавление методов работающих только с определенными полями, имхо, и будет добавлением такого лишнего кода... а ведь многие забывают, что объект это не суперзапись с методами, а самостоятельная сущность.... надо будет самому попробовать реализовать описанный мною трюк...
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4017
Зарегистрирован: 19.02.2013 16:54:51

Re: Свой тип (класс) с некоторым завихом.

Сообщение tema » 28.09.2017 22:04:08

vitaly_l писал(а):
tema писал(а):Примерчик бы использования..

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

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };

type
    TSomeRecord = record
        case boolean of
            false: (valint: integer);
            true: (valint64: int64);
    end;

var
SomeRecord : TSomeRecord;

begin
SomeRecord.valint    := 1;
//SomeRecord.valint64  := 1; // <== !
writeLn( SomeRecord.valint );
writeLn( SomeRecord.valint64 );

//SomeRecord.valint   := 11;  // <== !
SomeRecord.valint64  := 11;
writeLn( SomeRecord.valint );
writeLn( SomeRecord.valint64 );

readLn;

end.

Пример выдаёт просто
Код: Выделить всё
$ ./rec
1
1
11
11

Я это вроде и так понял, но как использовать boolean я так и не понял. Где фигурируют и как используются true и false?
tema
постоялец
 
Сообщения: 334
Зарегистрирован: 24.03.2011 20:19:27

Re: Свой тип (класс) с некоторым завихом.

Сообщение Лекс Айрин » 29.09.2017 09:16:07

tema писал(а): Где фигурируют и как используются true и false?


Фишка в том, что все вариантные части существуют одновременно и контроль за допустимостью обращения к ним полностью ложится на широкие плечи программиста.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4017
Зарегистрирован: 19.02.2013 16:54:51

Re: Свой тип (класс) с некоторым завихом.

Сообщение tema » 29.09.2017 09:17:10

Лекс Айрин писал(а):
tema писал(а): Где фигурируют и как используются true и false?


Фишка в том, что все вариантные части существуют одновременно и контроль за допустимостью обращения к ним полностью ложится на широкие плечи программиста.

Это я понял. Я спрашивал КАК? Каким образом используется true и false?
tema
постоялец
 
Сообщения: 334
Зарегистрирован: 24.03.2011 20:19:27

Re: Свой тип (класс) с некоторым завихом.

Сообщение Лекс Айрин » 29.09.2017 09:26:44

tema,.. с трудом. Четким самоконтролем использования.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4017
Зарегистрирован: 19.02.2013 16:54:51

Re: Свой тип (класс) с некоторым завихом.

Сообщение tema » 29.09.2017 09:27:29

Всё разобрался:
Предложение CASE... OF, открывающее вариантную часть, внешне похоже на соответствующий оператор выбора, но на самом деле лишь играет роль своеобразного служебного слова, обозначающего начало вариантной части. Именно поэтому в конце вариантной части не следует ставить END как пару к CASE... OF. (Поскольку вариантная часть - всегда последняя в записи, за ней все же стоит END, но лишь как пара к RECORD}. Ключ выбора в предложении CASE... OF фактически игнорируется компилятором: единственное требование, предъявляемое к нему Турбо Паскалем, состоит в том, чтобы ключ определял некоторый стандартный или предварительно объявленный порядковый тип. Причем сам этот тип никак не влияет ни на количество следующих ниже вариантных полей, ни даже на характер констант выбора. В стандартном Паскале в качестве ключа выбора необходимо указывать некоторую переменную порядкового типа, причем в исполняемой части программы можно присваивать значение этой переменной и таким образом влиять на выбор полей. В Турбо Паскале также можно в поле ключа выбора указывать переменную порядкового типа и даже присваивать ей в программе значение, что однако не влияет на выбор поля: значения констант выбора в Турбо Паскале могут быть произвольными, в том числе повторяющимися, например:

Код: Выделить всё
    type
      rec1 = record
        а: byte;
        b: word;
      end;
      rec2 = record
        c: longint;
        case x: byte of
          1: (d: word);
          2: (e: record
            case Boolean of
              3: (f: rec1);
              3: (g: single);
              '3': (c: word)
            end)
      end;
    var
      r: rec2;
    begin
      r.x := 255;
      if r.e.g = 0 then
        WriteLn('O.K.')
      else
        WriteLn(r.e.g)
    end.

В этом примере предложение

case Boolean of

в записи, определяемой в поле E, объявляет ключом выбора логический тип, который, как известно, имеет лишь два значения - TRUE и FALSE. Константы же выбора следующих далее вариантов не только содержат совершенно не свойственные этому типу значения, но и две из них повторяются, а общее количество вариантов - три, а не два, как следовало бы ожидать.
Имена полей должны быть уникальными в пределах той записи, где они объявлены, однако, если записи содержат поля-записи, т.е. вложены одна в другую, имена могут повторяться на разных уровнях вложенности (см. поле С в последнем примере).

Как-то я упустил эту конструкцию. Никогда раньше о ней не знал. А она оказывается реально с турбопаскаля ещё....
tema
постоялец
 
Сообщения: 334
Зарегистрирован: 24.03.2011 20:19:27

Re: Свой тип (класс) с некоторым завихом.

Сообщение Лекс Айрин » 29.09.2017 09:44:50

Как показала практика, особо она никому не нужна, а глюков собрать может столько, что нельзя исключить самозарождение в программе разума. Самый очевидный путь применения это преобразование типов.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4017
Зарегистрирован: 19.02.2013 16:54:51

Re: Свой тип (класс) с некоторым завихом.

Сообщение tema » 29.09.2017 14:12:27

Единственное чем я по такому преобразованию пользовался всегда это:
Код: Выделить всё
c:char;
a:byte absolute c;

Очень удобно :)
tema
постоялец
 
Сообщения: 334
Зарегистрирован: 24.03.2011 20:19:27

Пред.След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot] и гости: 3

Рейтинг@Mail.ru