|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Вопрос по типу данных
Подскажите пожалуйста! Существует ли в принципе тип данных описывающий массив из 8 значений типа да/нет размерностью в 1 байт, если нет то можно ли это как-то реализовать самому?
|
#2
|
||||
|
||||
Тип Byte
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
||||
|
||||
Т.к. ДА/НЕТ по сути своей булевое значение (TRUE/FALSE) и тип Boolean имеет размерность в 1 БАЙТ, то можно сделать массив размерностью 8 из булевых значений, что прямолинейно отвечает твоим требованиям.
Код:
type TYesNoArray = array[0..7] of Boolean; В этом случае посмотри работу с битами. Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#4
|
||||
|
||||
Ему нужен однобайтный массив из 8 элементов.
Т.е. SizeOf(чудомассив_из_8_элементов)=1 — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#5
|
|||
|
|||
Да верно я интересуюсь именно таким массивом.
|
#6
|
||||
|
||||
Ну если только свое делать.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#7
|
||||
|
||||
Да че там делать:
Код:
TFlagContainer = class data : byte; public procedure setData(id : integer; value : boolean); function getData(id : integer) : boolean; end; procedure TFlagContainer.setData(id : integer; value : boolean); begin if id >= 8 then exit; data := data and not (1 shl id); if value then data := data or (1 shl id); end; function TFlagContainer.getData(id : integer) : boolean; begin if ((data shr id) and 1) = 1 then result := true else result := false; end; Код:
TFlagContainer = class data : byte; public procedure setData(id : integer; value : boolean); function getData(id : integer) : boolean; end; procedure TFlagContainer.setData(id : integer; value : boolean); begin if id < 8 then data := data and not (1 shl id) or ((Byte(value) and 1 ) shl id); end; function TFlagContainer.getData(id : integer) : boolean; begin result := ((data shr id) and 1) = 1; end; jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 19.05.2013 в 00:07. |
#8
|
||||
|
||||
можно еще немного модифицировать:
Код:
type IFlagContainer = interface procedure SetData(ID: Byte; Value: Boolean); function GetData(ID: Byte): Boolean; property Value[Index: Byte]: Boolean read GetData write SetData; default; end; TFlagContainer = class(TInterfacedObject, IFlagContainer) private FData: Byte; procedure SetData(ID: Byte; Value: Boolean); function GetData(ID: Byte): Boolean; end; { TFlagContainer } procedure TFlagContainer.SetData(ID: Byte; Value: Boolean); begin FData:=FData and not (1 shl ID) or ((Byte(Value) and 1) shl ID); end; function TFlagContainer.GetData(ID: Byte): Boolean; begin Result:=((FData shr ID) and 1)=1; end; использование: Код:
var f: IFlagContainer; i: Integer; begin f:=TFlagContainer.Create; for i:=0 to 7 do f[i]:=(i mod 2)=0; for i:=0 to 7 do if f[i] then Memo1.Lines.Add(IntToStr(i)); end; Destroy объекту не нужен. Пишу программы за еду. __________________ |