Текущий архив: 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