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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.007 c
15-1234884844
Baks
2009-02-17 18:34
2009.04.26
Рисунки для игры


15-1235654209
Кто б сомневался
2009-02-26 16:16
2009.04.26
Анабиоз. Сон разума.


2-1236764497
Новичек
2009-03-11 12:41
2009.04.26
Программное изменение владельца файла.


2-1237123155
бобик
2009-03-15 16:19
2009.04.26
позиция курсора


15-1235259659
Nic
2009-02-22 02:40
2009.04.26
TWebBrowser





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