Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.04;
Скачать: CL | DM;

Вниз

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

 
Ш-К   (2005-08-12 10:11) [0]

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


 
begin...end ©   (2005-08-12 10:16) [1]

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


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

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:36) [3]

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

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


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

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


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

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

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


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

> Ш-К   (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].


 
Digitman ©   (2005-08-12 11:18) [7]

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;


 
Ш-К   (2005-08-12 11:27) [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:48) [9]

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;


 
Digitman ©   (2005-08-12 12:08) [10]


> const
>  TEnumRange = SizeOf(TEnum);


это - лишнее.


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

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


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

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


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

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


 
TUser ©   (2005-08-13 07:58) [14]

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


 
Lamer@fools.ua ©   (2005-08-13 08:04) [15]

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

$MINENUMSIZE



Страницы: 1 вся ветка

Текущий архив: 2005.09.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.048 c
8-1113240383
Eraser
2005-04-11 21:26
2005.09.04
Print Screen видео


1-1124023031
Aleksandrrr
2005-08-14 16:37
2005.09.04
русский язык в консольном приложении


1-1124189750
chili
2005-08-16 14:55
2005.09.04
Помогите с алгоритмом переноса по пробелу для Button.Caption


2-1092289278
jappak
2004-08-12 09:41
2005.09.04
Как урезать нужные символы?


2-1065376913
Оля85
2003-10-05 22:01
2005.09.04
Как вычислить значение функции