Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.07;
Скачать: [xml.tar.bz2];




Вниз

Количество значений в наборе 


vlv   (2002-01-21 21:07) [0]

Как узнать количество значений в наборе?

type
TMyAction = (caPlus, caMinus, caDiv, caMul);
TMyActions = set of TMyAction;

//...
var A:TMyActions;

Так вот, надо узнать количество значений в A



AlexR_R   (2002-01-21 22:02) [1]

Единственно, что пришло в голову

procedure TForm2.Button3Click(Sender: TObject);
var act_cur, act_from : TMyAction;
i, j, MaxCount : integer;
begin
A := [caPlus, caDiv];
MaxCount := 4; //Полное количество в наборе
act_cur := TMyAction(0);
act_from := act_cur;
i := 0;
for j := 0 to MaxCount - 1 do begin
if act_cur in A then inc(i);
inc(act_cur);
end;
Label1.Caption := intToStr(i);
end;


Но для этого надо знать полное количество элементов в наборе
А вот как его определить, что-то в голову сразу не приходит



Anatoly Podgoretsky   (2002-01-21 22:20) [2]

i := 0;
for j := Low(TMyAction) to High(TMyAction) do if J in A then i := i + 1;



Alx2   (2002-01-22 09:06) [3]

Еще вариант. :)
Мне кажется, он будет быстрее, но, правда, еще не проверял. Хотя речь идет не о скорости, но все же...
Идея проста. Множество в Object Pascal представляет собой битовую маску размером 32 байта. Каждый n-й бит - признак присутсвия n-го элемента во множестве. Таким образом просто считаем количество установленных бит во множестве.

function PowerOfSet(const aSet):byte;
Var
SetMap : packed array [1..32] of byte absolute aSet;
Const bitTable : array[0..255] of integer =
( 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,
4,3,4,4,5,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,
5,3,4,4,5,4,5,5,6,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,
4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,
6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,1,2,2,3,2,3,3,4,2,3,3,
4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,
5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,2,3,3,
4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,
7,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,
7,6,7,7,8);

Var k : integer;
begin
Result := 0;
for k := 1 to 32 do
inc(Result, bitTable[SetMap[k]]);
end;

Небольшая ремарка: параметр в PowerOfSet должен иметь "множественный тип", хотя никто не запрещает передавать все, что угодно, но что при этом получится :)).



Alx2   (2002-01-22 09:20) [4]

В догонку: этот пример работает только для 32-байтных множеств :(( Так что сорри. Опять поторопился.



Alx2   (2002-01-22 09:24) [5]

А вот теперь - для любых множеств:)


function PowerOfSet(const aSet; MaxSize : integer):byte;
Var
SetMap : packed array [1..32] of byte absolute aSet;
Const bitTable : array[0..255] of integer =
( 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,
4,3,4,4,5,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,
5,3,4,4,5,4,5,5,6,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,
4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,
6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,1,2,2,3,2,3,3,4,2,3,3,
4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,
5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,2,3,3,
4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,
7,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,
7,6,7,7,8);

Var k : integer;
begin
Result := 0;
for k := 1 to MaxSize do
inc(Result, bitTable[SetMap[k]]);
end;

Type
TSet = set of (caPlus, caMinus, caDiv, caMul);
Var S : TSet;
begin
S := [caPlus, caMul];
// Пример вызова.
Label1.Caption := "Кол-во элементов = "+IntToStr(PowerOfSet(S, sizeOf(S))); //2
end;




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.07;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.035 c
1-18872           AndrewK               2002-01-23 09:54  2002.02.07  
Как правильно создать и уничтожить форму


14-18948          Merlin                2001-12-17 11:59  2002.02.07  
Значения смайликов


1-18859           NLO                   2002-01-15 08:15  2002.02.07  
где взять Image для просмотра TIFF и PCX


4-19029           McSimm                2001-12-11 19:08  2002.02.07  
LogonUser и привилегии


1-18843           tvictor               2002-01-22 12:13  2002.02.07  
Как сделать 2х-строчный hint?