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

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

Интересный код


Unknown user ©   (2009-05-20 12:42:00) 

Вот встретил в исходниках Delphi 2009 следующий код:


 function ContainsPreamble(const Buffer, Signature: TBytes): Boolean;
 var
   I: Integer;
 begin
   Result := True;
   if Length(Buffer) >= Length(Signature) then
   begin
     for I := 1 to Length(Signature) do
       if Buffer[I - 1] <> Signature [I - 1] then
       begin
         Result := False;
         Break;
       end;
   end
   else
     Result := False;
 end;


Смутило, на мой взгляд, исскуственное усложнение. Я бы написал так:


 function ContainsPreamble(const Buffer, Signature: TBytes): Boolean;
 var
   I: Integer;
 begin
   Result := False;
   if Length(Buffer) < Length(Signature) then Exit;
   for I := 0 to Length(Signature) - 1 do
     if Buffer[I] <> Signature[I] then Exit;
   Result := True;
 end;


Где я проглядел тайный смысл?


Германн   (2009-06-01 01:00:00) [1]

P.P.S.
Забыл вчера поставить смайлик в своём сообщении. Но от постскриптума не отказываюсь.


Германн   (2009-05-31 01:24:00) [2]


> Игорь Шевченко ©   (29.05.09 16:29) [16]
>
> Дмитрий Белькевич   (29.05.09 15:56) [15]
>
> Заметь - я не говорю "не используйте", я говорю "убивать".
>  Это называется чисткой генофонда :)
>

Странно однако! Когда за "чистку генофонда" ратует кто-другой (например sniknik), ты против. Хотя Николай предлагает его (генофонд) "чистить" в гораздо более явных и насущных случаях!

P.S. Я, лично, ни от Exit, ни тем более от with не вижу причины отказываться столь радикально.


Anatoly Podgoretsky   (2009-05-30 00:34:00) [3]


> Дмитрий Белькевич   (29.05.09 15:56) [15]

А до него уже дело не дойдет в этом случае, если действовать последовательно.


Игорь Шевченко   (2009-05-29 16:29:00) [4]

Дмитрий Белькевич   (29.05.09 15:56) [15]

Заметь - я не говорю "не используйте", я говорю "убивать". Это называется чисткой генофонда :)


Дмитрий Белькевич   (2009-05-29 15:56:00) [5]


> За Exit - убивать сразу


А как же with ;) ?


Игорь Шевченко   (2009-05-21 21:35:00) [6]

Slym ©   (21.05.09 04:49) [9]


> непомню свойства проекта влияют на генофонд


не влияют.

Anatoly Podgoretsky ©   (21.05.09 15:39) [12]

Ну да, про Complete Boolean Evaluation я не подумал, потому как привык, что он всегда отключен.


Anatoly Podgoretsky   (2009-05-21 16:06:00) [7]

Сообственно у Игоря юольше написано, без лишних присвоений и выходов, в один оператора.

Result := (Length(Buffer) >= Length(Signature)) and (PWord(@Buffer[0])^=Signature);

Мой код только пример реструктизации Exit и учитывает различие настроек компилятора. При желании добавить ветку ELSE


Anatoly Podgoretsky   (2009-05-21 15:39:00) [8]


> Игорь, поясните, по какой причине Exit тут не подходит?

Не структурно.
>  if Length(Buffer) >= Length(Signature) then
>    Result := (PWord(@Buffer[0])^=Signature);


Palladin   (2009-05-21 15:29:00) [9]

По сугубо религиозной, ноги которой из goto растут ;)


Cobalt   (2009-05-21 15:19:00) [10]

> Игорь Шевченко ©   (20.05.09 17:28) [8]
>
> > function ContainsPreamble(const Buffer:TBytes;Signature:
>
> >  word): Boolean;
> > begin
> >  Result := False;
> >  if Length(Buffer) < Length(Signature) then Exit;
> >  Result := (PWord(@Buffer[0])^=Signature);
> > end;
>
> писатели...
>
> Result := (Length(Buffer) >= Length(Signature)) and (PWord(@Buffer[0])^=Signature);
>
> За Exit - убивать сразу


Игорь, поясните, по какой причине Exit тут не подходит?


Slym   (2009-05-21 04:49:00) [11]

Игорь Шевченко ©   (20.05.09 17:28) [8]
непомню свойства проекта влияют на генофонд, но при опции {$B+} получим что?
получим тоже что и в [8] но независимо от опций компиляции
function ContainsPreamble(const Buffer:TBytes;Signature: word): Boolean;
begin
if Length(Buffer) < Length(Signature) then
  Result := False
else
  Result := (PWord(@Buffer[0])^=Signature);
end;


Игорь Шевченко   (2009-05-20 17:28:00) [12]


> function ContainsPreamble(const Buffer:TBytes;Signature:
>  word): Boolean;
> begin
>  Result := False;
>  if Length(Buffer) < Length(Signature) then Exit;
>  Result := (PWord(@Buffer[0])^=Signature);
> end;


писатели...

Result := (Length(Buffer) >= Length(Signature)) and (PWord(@Buffer[0])^=Signature);

За Exit - убивать сразу


Slym   (2009-05-20 13:19:00) [13]

Unknown user ©   (20.05.09 13:14) [6]
тогда нафега городить динамомошину если размер известен заранее?
function ContainsPreamble(const Buffer:TBytes;Signature: word): Boolean;
begin
 Result := False;
 if Length(Buffer) < Length(Signature) then Exit;
 Result := (PWord(@Buffer[0])^=Signature);
end;

и стек не двигаем и циклов нету


Unknown user   (2009-05-20 13:14:00) [14]

>быстродействие при Length(Signature)<определенного числа допустим 64, на всем прочем отставание в разы

оно так и есть, Signature - это сигнатура кодовой страницы, двухбайтная.


Slym   (2009-05-20 13:11:00) [15]

Unknown user ©   (20.05.09 13:03) [4]
быстродействие при Length(Signature)<определенного числа допустим 64, на всем прочем отставание в разы


Unknown user   (2009-05-20 13:03:00) [16]

>а удивлятся нечему, двоешники есть везде...

Эта функция оптимизирована по быстродействию. Может здесь причина? Все направлено на получение быстрого ассемблерного кода?


Palladin   (2009-05-20 12:58:00) [17]

Function ContainsPreamble(const Buffer, Signature: TBytes): Boolean;
Begin
 If Length(Buffer) < Length(Signature)
  Then Result := False
  Else  Result:=CompareMem(@Buffer[0],@Signature[0],Length(Signature));
End;


а удивлятся нечему, двоешники есть везде...


Slym   (2009-05-20 12:55:00) [18]

Unknown user ©   (20.05.09 12:42)
меня больше смущает что в век 32бит и в скорем времени 64...
сравнение памяти реализуется побайтно по 8 бит


Slym   (2009-05-20 12:50:00) [19]

Unknown user ©   (20.05.09 12:42)
есть на паvяли косяк с циклом i:cardinal;
цикл for I := 0 to Length(Signature) - 1 do надолго зациклится при
Length(Signature) =0
но тут i:Integer и с ним это не канает


Наверх

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