Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как привести Integer к множеству?


Ш-К ©   (2005-08-12 10:11:00) 

Т.е. чтобы наличие элемента соответствовало взведенному биту.


Lamer@fools.ua   (2005-08-13 08:04:00) [1]

>> TUser ©   (13.08.05 07:58) [14]

$MINENUMSIZE


TUser   (2005-08-13 07:58:00) [2]

В принципе, если результат гарантированно умещается в integer, то можно воспользоваться диррективой absolute.
var I: integer;
   S: set of ttt;
begin
 I:=125;
 теперь в S нужное нам згначение
end;


Наиль   (2005-08-13 07:49:00) [3]

Вернее, для подобных задач Borland использует Include.


Наиль   (2005-08-13 07:47:00) [4]

Чем-то подобным занимается фунция Include


Ш-К   (2005-08-12 12:12:00) [5]

Digitman ©   (12.08.05 11:48) [9]
Спасибо. Супер.


Digitman   (2005-08-12 12:08:00) [6]


> const
>  TEnumRange = SizeOf(TEnum);


это - лишнее.


Digitman   (2005-08-12 11:48:00) [7]

type

TEnum = (e0, e1, e2, e3, e4, e5, e6, e7,
       e8, e9, e10, e11, e12, e13, e14, e15,
       e16, e17, e18, e19, e20, e21, e22, e23,
       e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36);
PSet = ^TSet;
TSet = set of TEnum;

const
 TEnumRange = SizeOf(TEnum);

function UntypedByteArrayToSet(var Value): TSet;
begin
 Result := PSet(@Value)^;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 pArray: PByteArray;
 e: TEnum;
 s: String;
begin
 GetMem(pArray, SizeOf(TSet));
 try
   FillChar(pArray^, SizeOf(TSet), 0);
   pArray[0] := 3;
   pArray[2] := 10;
   for e := Low(TEnum) to High(TEnum) do
     if e in UntypedByteArrayToSet(pArray^) then
       s := s + 'e' + IntToStr(Ord(e)) + ' ';
   showmessage(s);
 finally
   FreeMem(pArray);
 end;
end;


Ш-К   (2005-08-12 11:27:00) [8]

Lamer@fools.ua ©   (12.08.05 10:53) [5]
Мне хватит и exeption вызвать.

begin...end ©   (12.08.05 10:59) [6]
Digitman ©   (12.08.05 11:18) [7]
Спасибо.
А как сделать с нетипизированым мн-ом, типа этого:
procedure IntToSet(const InInt: Integer; out OutSet);


Digitman   (2005-08-12 11:18:00) [9]

type

TEnum = (e0, e1, e2, e3);
PSet = ^TSet;
TSet = set of TEnum;

function IntToSet(Value: Integer): TSet;
begin
 Result := PSet(@Value)^;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 i: Integer;
 e: TEnum;
 s: String;
begin
 i := 2;
 for e := e0 to e3 do
   if e in IntToSet(i) then
     s := s + 'e' + IntToStr(Integer(e)) + ' ';
 showmessage(s);
end;


begin...end   (2005-08-12 10:59:00) [10]

> Ш-К   (12.08.05 10:46) [4]

function IntToSet(Value: Integer): TSet;
var
 Count: Integer;
begin
 if sizeof(Result) < sizeof(Value) then
   Count := sizeof(Result)
 else
   Count := sizeof(Value);
 Move(Value, Result, Count)
end


Однако см. [5].


Lamer@fools.ua   (2005-08-12 10:53:00) [11]

>> Ш-К   (12.08.05 10:46) [4]

Тогда результат может не поместиться в Integer. В Integer на x86-32 больше 32 бит не сохранишь.


Ш-К   (2005-08-12 10:46:00) [12]

В том то и дело, что неизвестно. Может расти в процессе разработки.


begin...end   (2005-08-12 10:36:00) [13]

> Ш-К   (12.08.05 10:28) [2]

Чему равна мощность базового типа множества (т.е. типа TEnum)?


Ш-К   (2005-08-12 10:28:00) [14]

TEnum = (e0, e1, e2, e3, ...);
TSet = set of TEnum;

function IntToSet(Value: Integer): TSet;

Примеры вызова:

IntToSet(4) = [e2]
IntToSet(3) = [e0, e1]


begin...end   (2005-08-12 10:16:00) [15]

Переформулируйте вопрос. Что есть и что нужно получить?


Наверх

Титульная страница Поиск, карта сайта Написать письмо