Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];

Вниз

Поиск элемента множества по его естественному порядку.   Найти похожие ветки 

 
Ш-К   (2004-11-05 12:23) [0]

У меня есть переменная типа множество.
Как найти n-ый элемент переменной. Не индексируя элементы в цикле.

Просто интересно.


 
Семен Сорокин ©   (2004-11-05 12:42) [1]

хм, имхо, если взять за то, что элементы в множестве указаны в порядке возрастания, то только пробежаться в цикле по возможным элементам множества, увеличивая индекс при вхождении в множество, по достижении необходимого индекса - Break.


 
Digitman ©   (2004-11-05 12:46) [2]


> Как найти n-ый элемент переменной


задача сводится к чтению состояния n-ного бита массива, хранящего множество.


 
Ш-К   (2004-11-05 13:12) [3]

Семен Сорокин ©   (05.11.04 12:42) [1]
Так и сделал.

Digitman ©   (05.11.04 12:46) [2]
Тогда уж, нахождения индекса n-го единичного бита.


 
TUser ©   (2004-11-05 13:49) [4]

tset = (tsName1, tsName2);

var
 Form1: TForm1;

implementation
uses TypInfo;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
  for i:=0 to 1 do
     memo1.lines.add(getenumname(typeinfo(tset),i));
end;


 
TUser ©   (2004-11-05 13:50) [5]

Хотя, это я не про то ...


 
Digitman ©   (2004-11-05 13:59) [6]


> Тогда уж, нахождения индекса n-го единичного бита


ты сам себе противоречишь.
сначала тебе требуется узнать состояние n-ного бита, теперь тебе, видите ли, нужно узнать индекс единичного бита в массиве таковых ... а такого массива нет и быть не может, потому что мн-во предст.собой просто битовый массив, каждый из эл-тов которого имеет свой фикс.индекс и может быть либо сброшен либо взведен


 
Ш-К   (2004-11-05 14:35) [7]


> сначала тебе требуется узнать состояние n-ного бита

Не надо мне этого узнавать.
Что я буду знать, если, например, 3-й бит ноль? Как мне эту информацию сопоставить с поиском 3-го елемента в переменной?

А вот если отсчитать 3 встреченных единичных бита. То по найненному индексу последнего(если угодно: по фиксированному индексу простого битового массива) возможно выудить сам эломент.


 
Digitman ©   (2004-11-05 15:12) [8]


> Что я буду знать, если, например, 3-й бит ноль? Как мне
> эту информацию сопоставить с поиском 3-го елемента в переменной?


так и сопоставляй !

3-й эл-т в массиве и есть 3-й бит. И этот бит м.б как сброшен, так и установлен

поясняю.

пусть мн-во задано так :

type

TMySetItem = (Вася, Петя, Гоша, Дуся);
//Вася - это 0-й индекс
//Петя - это 1-й индекс
//Гоша - это 2-й индекс
//Дуся - это 3-й индекс

TMySet = set of TMySetItem;

//резервируем массив длиной 1 байт
var
MySet: TMySet;
...

if Дуся in MySet then .. //истина, если Дуся - в компании,т.е. 3-й бит байта, соотнесенного переменной MySet, взведен


 
Digitman ©   (2004-11-05 15:18) [9]


> Ш-К


а без цикла - только в асм-блоке специальной инструкцией

читаем мануал от Интел :

BSF—Bit Scan Forward
Description
Searches the source operand (second operand) for the least significant set bit (1 bit). If a least
significant 1 bit is found, its bit index is stored in the destination operand (first operand). The
source operand can be a register or a memory location; the destination operand is a register. The
bit index is an unsigned offset from bit 0 of the source operand. If the contents source operand
are 0, the contents of the destination operand is undefined.
Operation
IF SRC = 0
THEN
ZF ← 1;
DEST is undefined;
ELSE
ZF ← 0;
temp ← 0;
WHILE Bit(SRC, temp) = 0
DO
temp ← temp + 1;
DEST ← temp;
OD;
FI;
Flags Affected
The ZF flag is set to 1 if all the source operand is 0; otherwise, the ZF flag is cleared. The CF,
OF, SF, AF, and PF, flags are undefined.
Opcode Instruction Description
0F BC BSF r16,r/m16 Bit scan forward on r/m16
0F BC BSF r32,r/m32 Bit scan forward on r/m32


 
Digitman ©   (2004-11-05 15:25) [10]


> Ш-К


строго говоря, без цикла в общем случае, никак не обойтись.

BSF работает с src-операндом размером в
- байт (мн-во не более чем из 8-ми элементов)
- слово (мн-во не более чем из 16-ти элементов)
- дв.слово (мн-во не более чем из 32-х элементов)

все прочие случаи приводят к циклическому вызову BSF


 
DiamondShark ©   (2004-11-05 18:11) [11]

Странный вообще вопрос.
Для множеств нет вообще понятия "n-ый элемент".

Какой порядок имеется в виду?


 
Ш-К   (2004-11-09 10:40) [12]

Есть переменная типа множество (замете, не тип, а уже переменная).
Элементы, "содержащиеся" в переменной, заносятся в комбобох. Само-собой итемов у комбобоха каждый раз разное количество.
Нужно сопоставить итем, выбранный юзером, элементу множества.

Как автоматизировать процесс сопоставления, если типы множеств всегда разные (в идеале, типы узнаются в рантайм).


 
pasha_golub ©   (2004-11-09 10:46) [13]

Я чего-то не пойму, блин, заварушки...

TCombobox.Items:TStrings ->
TStrings.Data[Index]:Pointer

То бишь каждому лементу заноси в Дата сопоставленный элемент.


 
Ш-К   (2004-11-09 11:07) [14]

pasha_golub ©   (09.11.04 10:46) [13]
Я так и знал, что мысли не туда пойдут.
TCombobox я привёл для наглядности. То, что вы предлагаете, это индексирование при заносе. Если нельзя решить задачу без индесирования, так и скажите.

Повтроряюсь.
Есть тип множества, анцестируемый от перечисления.
Есть переменная этого типа.
Есть номер(инт) элемента в переменной.
Найти элемент.
Информации достаточно.


 
Digitman ©   (2004-11-09 11:21) [15]


> Ш-К   (09.11.04 11:07) [14]


ты никогда не задавался себе вопросом, каким образом Инспектор объектов редактирует и показывает содержимое некоего св-ва типа "множество" некоего выбранного компонента ?

так вот задайся для начала ... иди в модуль DsgnIntf.pas и изучи этот вопрос, начав с класса TSetProperty ... тогда и велосипед изобретать не придется


 
Ш-К   (2004-11-09 11:31) [16]

Digitman ©   (09.11.04 11:21) [15]
Задавался. Он показывает все элементы из описания типа множества.
Чуствуете разницу между типом и переменной, которая может содержать один элемент, и даже быть и пустой?


 
pasha_golub ©   (2004-11-09 11:43) [17]

Придется бежать по битовому массиву, но я тут ничего сложного не вижу абсолютно. А вот что я вижу, так это не удачное планирование, рах приходится извращаться таким вот образом.


 
Digitman ©   (2004-11-09 11:56) [18]


> Ш-К   (09.11.04 11:31) [16]


> Задавался


значит плохо задавался.


> Он показывает все элементы из описания типа множества


не боги горшки обжигают.
есть реализация метода TSetProperty.GetValue, в теле которого есть цикл по всем эл-там мн-ва .. в цикле отбираются только эл-ты мн-ва, прошедшие IN-проверку .. каждая IN-проверка - это асм-инструкция BT


> Чуствуете разницу между типом и переменной


я чувствую одно - у тебя путаница в голове


 
Digitman ©   (2004-11-09 12:03) [19]


> Ш-К   (09.11.04 11:31) [16]


вот оригинальный код :

function TSetProperty.GetValue: string;
var
 S: TIntegerSet;
 TypeInfo: PTypeInfo;
 I: Integer;
begin
 Integer(S) := GetOrdValue;
 TypeInfo := GetTypeData(GetPropType)^.CompType^;
 Result := "[";
//вот он - цикл по всем битам "переменной", содержащей мн-во !!
 for I := 0 to SizeOf(Integer) * 8 - 1 do
// i-й бит взведен ?
   if I in S then
//да, взведен.
   begin
//ЧТО мешает тебе вместо нижеследующих строчек реализовать свой код ?
     if Length(Result) <> 1 then Result := Result + ",";
     Result := Result + GetEnumName(TypeInfo, I);
   end;
 Result := Result + "]";
end;


 
begin...end ©   (2004-11-09 12:04) [20]

Ш-К   (09.11.04 11:07) [14]

> Есть номер(инт) элемента в переменной.

Вы можете толком объяснить, что Вы понимаете под номером элемента в переменной?


 
Ш-К   (2004-11-09 13:36) [21]

Digitman ©   (09.11.04 12:03) [19]
А есть отличия между:
Семен Сорокин ©   (05.11.04 12:42) [1] и
Digitman ©   (09.11.04 12:03) [19]?


 
Digitman ©   (2004-11-09 13:47) [22]


> Ш-К   (09.11.04 13:36) [21]


так-с ..

караул устал.

давай уже описывай КОНКРЕТНУЮ задачу.

безо всяких там "привел для наглядности"..

т.е. так как ее решение хочет видеть юзер .. а не твои инсинуации ..


 
Ш-К   (2004-11-10 09:31) [23]

Digitman ©   (09.11.04 13:47) [22]
Большое спасибо, но, имхо , решение уже звучало.
Без разницы, что перебирать: множество на вхождение элемента или битовый массив.

Всем спасибо.


 
Digitman ©   (2004-11-10 10:58) [24]


> Ш-К   (10.11.04 09:31) [23]


> Без разницы, что перебирать: множество на вхождение элемента
> или битовый массив


Совершенно верно.

Каждая Паскаль-конструкция

SomeSetItem IN SomeSet

в конечном итоге сводится к генерации компилятором соотв. маш.инструкции

BT (Bit Test)

у которой в числе операндов фигурируют все те же SomeSetItem (индекс бита) и SomeSet (нач.адрес блока памяти, состояния битов которого и определяет принадлежность множеству тех или иных элементов)

цикл.вызов IN-оператора приводит, соотв-но, к цикл.вызову BT-инструкции



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

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

Наверх




Память: 0.51 MB
Время: 0.035 c
14-1099353829
ДЫМ
2004-11-02 03:03
2004.11.21
Какой installer посоветуете?


14-1099645257
Dmitriy O.
2004-11-05 12:00
2004.11.21
Отчеты


1-1099480835
Tracer
2004-11-03 14:20
2004.11.21
Как в тело программы запихнуть файлы?


1-1099584984
uses-mind.dll
2004-11-04 19:16
2004.11.21
уничтожение динамически созданных объектов


4-1097657167
OPEN_ALWAYS
2004-10-13 12:46
2004.11.21
CreateFile c OPEN_ALWAYS - Почему каждый раз





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский