Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.04.26;
Скачать: CL | DM;

Вниз

Ндааааа....   Найти похожие ветки 

 
vuk ©   (2009-01-21 21:15) [0]

program Project1;
{$APPTYPE CONSOLE}

uses
 SysUtils,
 Generics.Collections;

var
 list: TList<integer>;
 i, index:integer;
begin
 list := TList<integer>.Create;
 try
   for i := 0 to 10 do
     list.Add(i);
   for i := 0 to 10 do
   begin
     if not list.BinarySearch(i, index) then
       index := -1;
     writeln(format("Value: %d; index: %d", [i, index]));
   end;
 finally
   list.Free;
 end;
 readln;
end.
-------------------------
Результат:

Value: 0; index: 0
Value: 1; index: -1
Value: 2; index: 0
Value: 3; index: -1
Value: 4; index: -1
Value: 5; index: 0
Value: 6; index: -1
Value: 7; index: -1
Value: 8; index: -1
Value: 9; index: -1
Value: 10; index: -1


 
Jeer ©   (2009-01-21 22:08) [1]

Да уж.. как  бы сказать поаккуратнее.. :)

Сколько лет писаю на того или иного вида "бамагу" - ну, еж твою - не возникает
какого-либо видоизменений лакмусовой "бамаги".
Ну, что я делаю не так ?
Объясните, в конце-то концов !
Не, не о том "конце" речь - с тем концом усе упорядке :)


 
Petr V. Abramov ©   (2009-01-21 22:14) [2]


> Объясните, в конце-то концов !
> Не, не о том "конце" речь - с тем концом усе упорядке :)

да, у меня все порядке.
Не, не о том "конце" речь - с тем концом усе упорядке :)


 
vuk ©   (2009-01-21 22:25) [3]

Что-то непонятно?
Delphi 2009, win32, дженерики, поиск половинным делением не работает. Напрочь.


 
ketmar ©   (2009-01-21 22:35) [4]

а шо это вы тут делаете? O_O

---
Do what thou wilt shall be the whole of the Law.


 
palva ©   (2009-01-21 22:46) [5]


> дженерики, поиск половинным делением не работает. Напрочь.

А может надо как-то сообщить этому списку, что он отсортирован? Данные, правда, по факту отсортированы... Но я бы поискал какое нибудь .sorted := true


 
KilkennyCat ©   (2009-01-21 22:50) [6]


> vuk ©

Генофонд не копал?


 
vuk ©   (2009-01-21 23:02) [7]

Список в данном случае отсортирован изначально, так что вызов сортировки ничего не даст. В генофонд заглянул. Ошибка именно там. Что за обезьяна писала BinarySearch я так и не понял. Но тестированием этого точно никто не занимался.


 
KilkennyCat ©   (2009-01-21 23:08) [8]

Странно, зачем его вообще трогали. И как его могли испортить? Это ж классика... Сегодня полюбопытствую, как машину восстановлю.


 
Сергей М. ©   (2009-01-21 23:13) [9]


> vuk ©   (21.01.09 23:02) [7]


А можно ли глянуть на генообезьянокод этого самого BinariSearch ?


 
vuk ©   (2009-01-21 23:16) [10]

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


 
KilkennyCat ©   (2009-01-21 23:27) [11]

Страшно то, что теперь нельзя будет доверять ни чему...


 
vuk ©   (2009-01-21 23:50) [12]


class function TArray.BinarySearch<T>(const Values: array of T; const Item: T;
 out FoundIndex: Integer; const Comparer: IComparer<T>; Index,
 Count: Integer): Boolean;
var
 L, H: Integer;
 mid, cmp: Integer;
begin
 if (Index < Low(Values)) or (Index > High(Values))
   or (Index + Count - 1 > High(Values)) or (Count < 0)
   or (Index + Count < 0) then
   raise EArgumentOutOfRangeException.CreateRes(@sArgumentOutOfRange);
 if Count = 0 then
 begin
   FoundIndex := 0;
   Exit(False);
 end;

 L := Index;
 H := Index + Count - 1;
 while L <= H do
 begin
   mid := L + (H - L) shr 1;
   cmp := Comparer.Compare(Values[mid], Item);
   if cmp < 0 then
     L := mid + 1
   else if cmp = 0 then
   begin
     FoundIndex := L;
     Exit(True);
   end;
   H := mid - 1;
 end;
 FoundIndex := L;
 Result := False;
end;


 
jack128_   (2009-01-21 23:56) [13]

Удалено модератором


 
jack128_   (2009-01-21 23:58) [14]

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


 
vuk ©   (2009-01-22 01:14) [15]

Собственно да, компилятор на дженериках пока того... Смотрю в QC... Жесть... В принципе, примерно это и ожидалось... :(


 
Германн ©   (2009-01-22 01:21) [16]


> KilkennyCat ©   (21.01.09 23:27) [11]
>
> Страшно то, что теперь нельзя будет доверять ни чему...
>

А уже давно нельзя доверять ничему и никому! Первым меня подвёл Atmel. И до сих пор я не смог решить эту задачу. :(


 
Eraser ©   (2009-01-22 01:23) [17]

> [15] vuk ©   (22.01.09 01:14)


> Смотрю в QC... Жесть... В принципе, примерно это и ожидалось...

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


 
KilkennyCat ©   (2009-01-22 01:48) [18]


> Германн ©

Я тебе предлагал помощь. Предлагаю и сейчас, ибо полностью в Атмелах сейчас.


 
Германн ©   (2009-01-22 01:52) [19]


> KilkennyCat ©   (22.01.09 01:48) [18]
>
>
> > Германн ©
>
> Я тебе предлагал помощь. Предлагаю и сейчас, ибо полностью
> в Атмелах сейчас.
>

Я помню. Почта в анкете рабочая? Если да, то спрошу завтра.


 
test   (2009-01-22 05:25) [20]

А в какой версии появились типизированные TList?


 
KilkennyCat ©   (2009-01-22 09:20) [21]


> Германн ©   (22.01.09 01:52) [19]

в анкете не помню, здесь - да.


 
Sha ©   (2009-01-22 11:18) [22]

На первый взгляд в [12] нет ошибки.


 
Sha ©   (2009-01-22 11:37) [23]

нашел )
FoundIndex := L;


 
Marser ©   (2009-01-22 11:37) [24]

Это дженерики тут только сейчас появились или я что-то важное раньше пропустил?


 
vuk ©   (2009-01-22 11:43) [25]

to Sha ©   (22.01.09 11:18) [22]:
>На первый взгляд в [12] нет ошибки.
Ага. Ну да, похоже. Только вот на второй, а особенно после трассировки, становится видна вся белиберда. Для начала обратите внимание, что именно функция возвращает в качестве результата, когда cmp = 0.

Вот, для осознания разницы, вариант из QC, который предложил Rudy Velthuis:

class function TArray.BinarySearch<T>(const Values: array of T; const Item: T;
 out FoundIndex: Integer; const Comparer: IComparer<T>; Index,
 Count: Integer): Boolean;
var
 L, H: Integer;
 mid, cmp: Integer;
begin
 if (Index < Low(Values)) or (Index > High(Values))
   or (Index + Count - 1 > High(Values)) or (Count < 0)
   or (Index + Count < 0) then
   raise EArgumentOutOfRangeException.CreateRes(@sArgumentOutOfRange);
 if Count = 0 then
 begin
   FoundIndex := 0;
   Exit(False);
 end;

 Result := False;
 L := Index;
 H := Index + Count - 1;
 while L <= H do
 begin
   mid := L + (H - L) shr 1;                  
   cmp := Comparer.Compare(Values[mid], Item);
   if cmp < 0 then                 // mods 09/29/2008 R. Velthuis
     L := mid + 1
   else
   begin
     H := mid - 1;
     if cmp = 0 then
       Result := True;
   end;
 end;
 FoundIndex := L;
end;


Или вот еще:
function TStringList.Find(const S: string; var Index: Integer): Boolean;
var
 L, H, I, C: Integer;
begin
 Result := False;
 L := 0;
 H := FCount - 1;
 while L <= H do
 begin
   I := (L + H) shr 1;
   C := CompareStrings(FList^[I].FString, S);
   if C < 0 then L := I + 1 else
   begin
     H := I - 1;
     if C = 0 then
     begin
       Result := True;
       if Duplicates <> dupAccept then L := I;
     end;
   end;
 end;
 Index := L;
end;


 
Добежал   (2009-01-22 11:44) [26]


>  list: TList<integer>;

а что это такое за определение <integer>?!?!


 
Sha ©   (2009-01-22 11:51) [27]

vuk ©   (22.01.09 11:43) [25]

думаю, там у них просто ошибка при копи-паст вкралась (см. [23])

достаточно первый FoundIndex := L;
заменить на FoundIndex := mid;


 
vuk ©   (2009-01-22 11:54) [28]

to Marser ©   (22.01.09 11:37) [24] :
>Это дженерики тут только сейчас появились или я
>что-то важное раньше пропустил?
В D2009 они появились. Но, судя по QC, всё это пока неюзабельно. Помимо того, что в самой библиотеке такие вот ляпы, так еще и компиятор фигню гонит.

to Добежал   (22.01.09 11:44) [26]:
>  list: TList<integer>;
а что это такое за определение <integer>?!?!
integer - это тип данных такой. :) А TList<integer> - это объявление строго типизированного списка для элементов типа integer.


 
Sha ©   (2009-01-22 11:55) [29]

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


 
vuk ©   (2009-01-22 11:59) [30]

to Sha ©   (22.01.09 11:51) [27]:
>думаю, там у них просто ошибка при копи-паст вкралась (см. [23])
Да нет, это не копи-паст. Это человек решил цикл соптимизировать. Ну и "соптимизировал" - посмотрел, что за пределами цикла возвращается в качестве найденного индекса, прописал это в FoundIndex и свалил из функции. А то, что переменная еще в пределах цикла меняется, если не свалить, то это как-то от него ускользнуло. А на тестирование вообще забил.


 
ketmar ©   (2009-01-22 12:16) [31]

>[30] vuk © (2009-01-22 11:59:00)
потому что кодожир — страшное, неописуемое, ненужное говно. как и все дельфя после D7, увы.

---
All Your Base Are Belong to Us


 
vuk ©   (2009-01-22 12:19) [32]

to ketmar ©   (22.01.09 12:16) [31]:
>потому что кодожир — страшное, неописуемое, ненужное говно.
>как и все дельфя после D7, увы.

Ну, надо сказать, что D2009 на больших проектах стабильнее и D7 и D6...


 
han_malign ©   (2009-01-22 13:12) [33]


> достаточно первый FoundIndex := L;
> заменить на FoundIndex := mid;

H := mid - 1;


 
MBo ©   (2009-01-22 13:54) [34]

>Да нет, это не копи-паст. Это человек решил цикл соптимизировать. Ну и "соптимизировал"

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

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


 
Sergey Masloff   (2009-01-22 14:19) [35]

MBo ©   (22.01.09 13:54) [34]
Это в Керниган-Пайк "Практика программирования", насколько я помню.
Ключевое слово - с первого раза. Видимо там сетак и пишут - что вижу то пише пользователи протестируют ;-)


 
vuk ©   (2009-01-22 14:37) [36]

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


 
vuk ©   (2009-01-22 14:46) [37]

Да, ещё. Если даже вернуть mid и поставить H := mid - 1 туда, куда надо, то такая реализация не будет учитывать возможное наличие дубликатов. Так что нормальная реализация - та, что из QC.


 
pasha_golub ©   (2009-01-22 16:32) [38]

Мужики, ну шо вы взъелись? Хлопцы по ночам код хреначили. Какие еще могу быть результаты. Но вот огорчило меня это. я так надеялся на дженерики, блин. задолбался уже TObjectList"ы городить кругом


 
vuk ©   (2009-01-22 16:43) [39]

Паш, их, конечно, юзать можно, но только осторожно очень. И, похоже, лучше свою реализацию классов наваять... Хотя, от глюков компилятора это не спасет.


 
qqq   (2009-01-22 17:08) [40]


> выпускают обновления, где не исправлены все известные баги,
>  что вкорне не правильно.

пытаются побыстрее залепить особо зияющие дыры, а остальные потом, отдельно

кстати, где можно качнуть обновления, чтоб не просило код регистрации?



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

Текущий архив: 2009.04.26;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.013 c
2-1236591711
Franzy
2009-03-09 12:41
2009.04.26
Указатели и работа с вирт. памятью


2-1236773609
Term
2009-03-11 15:13
2009.04.26
Вопрос по выделению цветом в TRichEdit


2-1236879849
motor666
2009-03-12 20:44
2009.04.26
СВЯЗНЫЕ ТАБЛИЦЫ. ПОМОГИТЕ С DBGRID


2-1236067326
SKIPtr
2009-03-03 11:02
2009.04.26
Как программно свернуть программу


10-1155687227
big_bugzy
2006-08-16 04:13
2009.04.26
Как работать с интерфейсами ,если в TLB нету самого объекта?