Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как объяснить следующий код ?


массив ©   (2004-09-07 01:13:00) 

type  
 PByteSet = ^TByteSet;  
 TByteSet = set of Byte;  
var  
 W: Word;  
...  
{ если бит 3 в слове W установлен, тогда ... }  
 if 3 in PByteSet(@W)^ then ...  

Что означает 3 in PByteSet(@W)^? Эти собака, галочка, по отдельности и в целом, что значат ?


Defunct   (2004-09-08 07:04:00) [1]

> Ну так есть же уже PByteSet, зачем же ещё галочка ?

PByteSet = ^TByteSet

> А две галочки подряд зачем ?

Значит был указатель на указатель на данные.


массив   (2004-09-08 06:54:00) [2]


> ^ - то что под указателем, другими словами - данные на которые
> указывает указатель.

Ну так есть же уже PByteSet, зачем же ещё галочка ?
PByteSet(@W)^
А две галочки подряд зачем ?


Defunct   (2004-09-08 06:45:00) [3]

> А что означает галочка (^) в конце ? Зачем она ?

^ - то что под указателем, другими словами - данные на которые указывает указатель.

Var P : PInteger;
   I : Integer;

 P := @I;
 I := 1000; тоже самое, что и  P^ := 1000;


массив   (2004-09-08 06:17:00) [4]


> Digitman ©   (07.09.04 08:17) [13]
>
> > массив   (07.09.04 01:13)  
>
>
> PByteSet(@W)^ для компилятора означает : взять адрес (@)
> переменной W и рассматривать его как указатель (PByteSet)
> на данные типа TByteSet

А что означает галочка ( ^) в конце ? Зачем она ?

Нашёл в исходниках в модуле TypInfo.pas ещё интересную запись :
PropInfo^.PropType^^.Kind
Тут две галочки подряд. Адрес адреса ? Или что это ?


Verg   (2004-09-07 08:45:00) [5]


> А с чего это word приводится к set of byte?


Там приводятся указатели на ...( word к set of byte )


DiamondShark   (2004-09-07 08:39:00) [6]

Оппа... А с чего это word приводится к set of byte?
Размер set of byte -- 256 бит = 32 байт.

Если уж работать с word, то тогда set of 0..15


Digitman   (2004-09-07 08:17:00) [7]


> массив   (07.09.04 01:13)  


PByteSet(@W)^ для компилятора означает : взять адрес (@) переменной W и рассматривать его как указатель (PByteSet) на данные типа TByteSet


Sergey Kaminski   (2004-09-07 04:47:00) [8]

Defunct ©   (07.09.04 04:00) [11]

Разумеется, я комментировал только приведенный код, в котором индекс тестируемого бита известен на этапе компиляции.

btвыполняется медленнее testгде-то в 3 раза, так что верю и насчет 30-40%.


Defunct   (2004-09-07 04:00:00) [9]

Sergey Kaminski ©   (07.09.04 03:31) [10]
вы что считаете, что там в сравнении всегда будет цифра 3?
А если там будет переменная?
Var X:Byte;

if X in PByteSet(@W)^ then

Вот какой код я вижу при выполнении сравнения с переменной (с включенной оптимизацией:

push ebp     ; - это можно опустить
mov  ebp,esp   ; - это тоже не всчет
push ecx
mov  [ebp-$01],al
mov  eax, @W^
mov  dl,[ebp-$01]
and  edx,$FF
bt[eax],edx
jnb <To Else>


Как видите здесь медленная команда bt , и 3 обращения к стеку. А когда мы сами создадим массив масок, команда test гарантирована, независимо от того как мы будем задавать номер бита: константой или переменной.

Случай с 1 shl 3.. тоже добавит нам лишний сдвиг если на месте "3" будет переменная. Создать массив масок не так уж и сложно, а ускоряет работу процентов на 30-40% специально тестировали.


Sergey Kaminski   (2004-09-07 03:31:00) [10]

Да нет, ничего оно тормозить не будет. Все сведется к

asm
 test  byte ptr [eax],const
end;


абсолютно точно также как и в случае

((1 shl 3) and w)


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


Defunct   (2004-09-07 03:15:00) [11]

> Что означает 3 in PByteSet(@W)^ ? Эти собака, галочка, по отдельности и в целом, что значат ?

Означает, что если у вас много таких сравнений, то программа будет очень сильно тормозить.

in работает очень медленно.

хотите нормальную скорость, создайте поразрядный массив масок.

ZMasks : Array[0..15] of Word = ($0001, $0002, $0004 $0008, $0010 и т.д.)

надо проверить 3-й бит, проверяйте:

If W and ZMasks(3)=1 Then ...
                    Else ...


Sergey Kaminski   (2004-09-07 01:56:00) [12]

А в случае 3 in PByteSet(@W)^ всё понятно сразу.

Ну так если понятно, что объяснять-то?


массив   (2004-09-07 01:49:00) [13]


> Sergey Kaminski ©   (07.09.04 01:36) [5]
> А заодно и об операциях с битами. Кстати у Подгорецкого
> толковая есть статья об этом.

Про биты я и сам статью могу написать, только мне это ненадо.

Запись с битами выглядит нечитаемой ((1 shl 3) and w) <> 0, потому, что глядя на неё надо задуматься, что она означает. А в случае 3 in PByteSet(@W)^всё понятно сразу.


> Это я к тому, что для человека, знакомого с
> 1. Типизированными указателями
> 2. Сетами

Интуитивно тут и так понятно, что проверяется установка бита. А интересует толковое словесное объясниние, того как это происходит.

Кто-нибудь может объяснить без выпендриваний ?


Sergey Kaminski   (2004-09-07 01:40:00) [14]

Это я к тому, что для человека, знакомого с
1. Типизированными указателями
2. Сетами
3. Операциями с битами
приведенный тобой код полностьюпрозрачен и очевиден


Sergey Kaminski   (2004-09-07 01:36:00) [15]

Вместо того, чтобы восторгаться корявымвариантом с типизированным указателем и насильственным приведением к нему указателя на паременную, лучше потратить время с пользой и прочитать доку по языку, главы о этих самых указателях, сетах и прочем. Не так ли?

А заодно и об операциях с битами. Кстати у Подгорецкого толковая есть статья об этом. И тогда, я уверен, поймешь, почему вариант, приведенный jack128 и красив и достаточен.


массив   (2004-09-07 01:23:00) [16]


> jack128 ©   (07.09.04 01:18) [3]
> массив   (07.09.04 1:13)
> Хак это..Не стоит так делать.. Лудше уж if ((1 shl 3) and
> w) <> 0 then

Наоброт, мне понравилась краткость и читаемость 3 in PByteSet(@W)^, в отличие от ((1 shl 3) and w) <> 0

Поэтому хочу её лучше понять. Кто-нибудь может без выпендриваний, толково объяснить ?


jack128   (2004-09-07 01:18:00) [17]

массив   (07.09.04 1:13)
Хак это..Не стоит так делать.. Лудше уж if ((1 shl 3) and w) <> 0 then


Sergey Kaminski   (2004-09-07 01:17:00) [18]

лучше будет, если изучишь Language Ref.


Sergey Kaminski   (2004-09-07 01:17:00) [19]

а то ведь следующим вопросом будет: "а что значит var"


Наверх

Титульная страница Поиск, карта сайта Написать письмо