Основы работы с БД

Любые обсуждения, не нарушающие правил форума.

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

Re: Основы работы с БД

Сообщение alexs » 06.05.2008 15:22:40

вставить в программу скриптовый язык
а скрипты хранить в этом же файле
будет полностью настраиваемая :lol:
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Основы работы с БД

Сообщение v-t-l » 06.05.2008 16:31:00

Ну скриптовый язык - это слишком, а несколько предопределенных таблиц с информацией об интерфейсе (например, надписи полей или какие таблицы дампить в качестве результата) можно организовать.
v-t-l
энтузиаст
 
Сообщения: 733
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Основы работы с БД

Сообщение Troublemaker » 06.05.2008 20:44:26

Эк куда вас занесло! :)

Интересно, это я не увидел, или в FP нет штатного способа работы с битовыми полями?

Есть n-байтный массив, который надо рассматривать как массив двухбитных полей (битовых дуплетов), то есть иметь возможность установить/прочесть значение любой пары битов. Первый бит пары всегда четный (0-ой, 2-ой и т.д.), то есть в каждом байте всегда четыре пары и никогда пара не пересекает границу между байтами.
При длине массива до 8 байт включительно, вместо массива можно воспользоваться соответствующим целым типом и битовыми масками. Но длина массива неизвестна, требуется решение для общего случая.

Я вышел из положения так (комментарии писал для себя, когда отлаживал - Shade, помнишь ремарку из Уэзерелла? вот оно и есть):

TMatrixCodeByte - тот самый байтовый массив.
Код: Выделить всё
//Типы данных и константы
const CMatrixSide=8; //сторона квадрата}
      CMatrixSize=CMatrixSide*CMatrixSide; //Размер матрицы
      CSpyralLength=CMatrixSize shr 2; //Длина спирали
      CMatrixCodeBytes=CSpyralLength shr 2; //Байтов в коде матрицы
     
type TCoordsYX=array[1..2] of byte; //две координаты ячейки спирали
     TSpyralDef=array[1..CSpyralLength] of TCoordsYX; //сколько-то ячеек в одной спирали
     TMatrixDef=array[1..4] of TSpyralDef; //4 спирали в матрице в одном положении
     TTheMatrix=array[1..CMatrixSide,1..CMatrixSide] of char; //массив "дырочек"
//Тип данных для хранения кода матрицы, в одном байте хранятся 4 дуплета, то есть на каждые 4 ячейчки
//требуется один байт, поэтому делится на 4 сдвигом вправо два раза
     TMatrixCodeByte=array[1..CMatrixCodeBytes] of byte;
skipped
Код: Выделить всё
//Задать значение дуплета в нужной позиции
procedure Set2Bits(var where:TMatrixCodeByte;BitDupPos,Value:byte);
//BitDupPos - позиция дуплета, отсчет СПРАВА, нумеруются с ЕДИНИЦЫ
//Value - 1..4
var   BitPos, BytePos, Shifted, Mask:byte;
      begin
           If BitDupPos>CSpyralLength then exit;
//номер байта, в котором менять, байты нумеруются справа налево, а индексы массивов растут вправо
//функция pred используется вместо "-1"
//shl и shr побитово сдвигают свой левый аргумент на правый_аргумент раз, умножая или деля на степень двойки
           shifted:=pred(BitDupPos) shr 2;
           BytePos:=CMatrixCodeBytes-Shifted;
//для получения битовой позиции дуплета берем остаток от деления на 4 числа на единицу меньшего,
//чем нужное иначе возникают накладки. Например, 12 mod 4=0, и устанавливаются два младших бита,
//в то время, как надо два старших
           BitPos:=(pred(BitDupPos) mod 4) shl 1;
//обнуляем всё, кроме двух младших битов: значение должно быть в диапазоне 0-3
//потом сдвигаем значение влево для получения нужной позиции в байте
           value:=(pred(value) and 3) shl BitPos;
//маскируем все биты байта, кроме двух требуемых
           mask:=(3 shl bitpos) xor 255;
           where[BytePos]:=where[BytePos] and mask;
           where[BytePos]:=where[BytePos] or value;
      end;

//Получить значение дуплета в нужной позиции
function Get2Bits(where:TMatrixCodeByte;BitDupPos:byte):byte;
var   BitPos, BytePos, Mask:byte;
      begin
//комментарии к логике см. в Set2Bits
           If BitDupPos>CSpyralLength then exit;
//номер байта, начиная СПРАВА
           BytePos:=CMatrixCodeBytes-(pred(BitDupPos) shr 2);
           BitPos:=(pred(BitDupPos) mod 4) shl 1;
           mask:=3 shl bitpos; //) xor 255;
//обнуляем всё кроме двух нужных битов
           result:=((where[BytePos] and mask)shr BitPos)+1;
      end;
Код, может, не самый оптимальный, но речь не об его оптимизации, а о другом способе работы с нужными данными - есть таковой или нет?
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: Основы работы с БД

Сообщение Sergei I. Gorelkin » 06.05.2008 21:23:37

Troublemaker писал(а):Код, может, не самый оптимальный, но речь не об его оптимизации, а о другом способе работы с нужными данными - есть таковой или нет?


Да вроде недавно появилась поддержка bitpacked массивов и записей. Правда, в деле сам я ее пока что не пробовал... И даже не знаю, есть ли оно в версии 2.2.0, возможно, нужно брать 2.3.1.
Код: Выделить всё
type
  T2Bits = 0..3;
  T2BitsArray = bitpacked array[0..x] of T2Bits;
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Основы работы с БД

Сообщение Troublemaker » 06.05.2008 21:35:39

Sergei I. Gorelkin писал(а):Да вроде недавно появилась поддержка bitpacked массивов и записей.
Выглядит заманчиво, но в 2.2.0 (Lazarus-0.9.24.1-fpc-2.2.0-20080417-win32.exe) в исходниках rtl слово bitpacked встречается только единожды в имени константы - \lazarus\fpc\2.2.0\source\packages\extra\palmunits\inetmgr.pp - файл 2005 года.

Тут, однако, другой момент есть - этот битовый массив ДОЛЖЕН иметь возможность быть использован как БАЙТОВЫЙ. Интересно, что покажет SizeOf(bipacked array[0..3] of T2Bits) ? Если не единицу, то грустно.
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: Основы работы с БД

Сообщение alexs » 06.05.2008 22:08:17

напиши клас-обёртку
чтобы он грузил в себя последовательность байт и давал доступ к этим байтам по разному - или как биты или как байты - достаточно элементарная вещь
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Основы работы с БД

Сообщение Troublemaker » 07.05.2008 06:04:29

alexs писал(а):напиши клас-обёртку
Гм... по сути у меня так и сделано, но спрашивал я про штатные возможности - есть они или нет.
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Пред.

Вернуться в Потрепаться

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

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

Рейтинг@Mail.ru