Главная страница
    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.47 MB
Время: 0.01 c
14-1123765294
kosenka
2005-08-11 17:01
2005.09.04
help


2-1123283495
dimona
2005-08-06 03:11
2005.09.04
cordinati Button-a


3-1121704689
xroot
2005-07-18 20:38
2005.09.04
Установка базы


9-1115754839
Georgij
2005-05-10 23:53
2005.09.04
Как осуществить возведение в степень 1/3 ?


1-1123593987
Alexey_T-O
2005-08-09 17:26
2005.09.04
Конвертация olevariant





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский