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

Вниз

Queue. Объясните, чего ему ещё надо?   Найти похожие ветки 

 
K-1000 ©   (2016-04-03 19:20) [0]


var
 Queue: TObjectQueue;

procedure InitQueue();
begin
 Queue:= TObjectQueue.Create();

 Queue.Push(TObject.Create());
 Queue.Push(TButton.Create());
 Queue.Push(TBitmap.Create());
end;

function GetNextNameOfObjectFromQueue(): String;
var
 Value: TObject;
begin
 Value:= Queue.Pop();

 if Assigned(Value) then
 begin
   Result:= String(Value.ClassName);

 end else
 begin
   Result:= "[ EMPTY ]";

 end;
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
 Caption:= GetNextNameOfObjectFromQueue();
end;


По идее, если нажимать на кнопку, то в заголовке окна должны прописываться имена классов очереди.
После последнего элемента выкидывает такое: "List index out of bounds (-1)".
О чего так? Ведь по идее по окончании очереди Pop() должен вернуть nil.


 
Юрий Зотов ©   (2016-04-03 19:46) [1]

> Ведь по идее по окончании очереди Pop() должен вернуть nil.

Может вернуть NIL, а может и исключение выбросить (что и делает). Все зависит от реализации.


 
Eraser ©   (2016-04-03 19:47) [2]


> Ведь по идее по окончании очереди Pop() должен вернуть nil.

видимо нет. см. исходник.


 
Dimka Maslov ©   (2016-04-03 20:28) [3]

Именно поэтому не стоит пользоваться подобными библиотеками и фреймворками - они могут выкинуть всё что угодно.


 
sniknik ©   (2016-04-03 20:37) [4]

> они могут выкинуть всё что угодно.
хелп/исходники же есть...

function GetNextNameOfObjectFromQueue(): String;
begin
 if Queue.Count > 0
   then Result:= Queue.Pop().ClassName
   else Result:= "[ EMPTY ]";
end;


 
Dimka Maslov ©   (2016-04-03 20:47) [5]


> хелп/исходники же есть...


Хелп, созданный автоматической помощесоздалкой, который на 95% состоит из записей This is so-and-so method... Действительно серьёзное подспорье в использовании кода. Тем более, что так ничего и не понятно, почему очередь выкидывает исключение вместо возврата нуля...


 
sniknik ©   (2016-04-03 20:48) [6]

хотя правильнее будет так:
function GetNextNameOfObjectFromQueue(): String;
begin
 if Queue.Count = 0
   then Result:= "[ EMPTY ]"
   else
     with Queue.Pop() do begin
       Result:= ClassName;
       Free;
     end;
end;


 
sniknik ©   (2016-04-03 20:51) [7]

> который на 95% состоит из записей This is so-and-so method...
ну, не знаю, у меня нормальный

TObjectQueue
Hierarchy Methods See also
TObjectQueue maintains a first-in first-out list of objects.
Unit
Contnrs
Description
Use a TObjectQueue to store and maintain a first-in first-out list of objects.

Removes and returns the object at the front of the queue.

Delphi syntax:
function Pop: TObject;
C++ syntax:
HIDESBASE System::TObject* __fastcall Pop(void);

Description
Call Pop to retrieve an object from the queue. Pop removes the next object from the queue (that is, the earliest object added), then returns a reference to the deleted object.
To access the queue without removing an object, call Peek.


 
Юрий Зотов ©   (2016-04-03 21:10) [8]

> Dimka Maslov ©   (03.04.16 20:47) [5]

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

Потому что NIL может сидеть в очереди. И если вместо исключения выдать NIL, то будет непонятно - то ли очередь пуста, то ли в ней NIL сидел. А с исключением все однозначно.


 
K-1000 ©   (2016-04-03 21:59) [9]


> sniknik ©   (03.04.16 20:48) [6]
> хотя правильнее будет так:
> function GetNextNameOfObjectFromQueue(): String;
> begin
>  if Queue.Count = 0
>    then Result:= "[ EMPTY ]"
>    else
>      with Queue.Pop() do begin
>        Result:= ClassName;
>        Free;


А зачем вызывать Free() ведь Pop() удаляет объект из очереди?


 
K-1000 ©   (2016-04-03 22:00) [10]


> Юрий Зотов ©   (03.04.16 21:10) [8]
> > Dimka Maslov ©   (03.04.16 20:47) [5]
>
> > почему очередь выкидывает исключение вместо возврата нуля
>
> Потому что NIL может сидеть в очереди. И если вместо исключения
> выдать NIL, то будет непонятно - то ли очередь пуста, то
> ли в ней NIL сидел. А с исключением все однозначно.


Точно! Что-то этот момент упущен был извиду. :)


 
DVM ©   (2016-04-03 22:11) [11]


> А зачем вызывать Free() ведь Pop() удаляет объект из очереди?
>
>
>

Если объект далее нужен, то Free конечно не нужно вызывать. Pop() только удаляет из очереди его, сам объект нужно уничтожать как обычно.


 
DVM ©   (2016-04-03 22:13) [12]

Вообще про nil в очереди конечно такое возможно, но на практике маловероятно, ибо проще не класть nil в очередь, чем потом проверять.


 
Dimka Maslov ©   (2016-04-03 22:18) [13]


>
> Потому что NIL может сидеть в очереди


Я бы ни за что не стал пихать nil в очередь. Лучше создать "пустой" объект, нежели потом AV отлавливать.


 
Юрий Зотов ©   (2016-04-03 23:16) [14]

> DVM ©   (03.04.16 22:11) [11]
> Dimka Maslov ©   (03.04.16 22:18) [13]


NIL в очереди (да и вообще в любом списке объектов) может быть значимым для алгоритма. Хотя я бы тоже от такого алгоритма, скорее всего, постарался  бы воздержаться, но задачи разные бывают и NIL в списке может оказаться вполне удачным решением.


 
Dimka Maslov ©   (2016-04-04 08:18) [15]


> NIL в очереди (да и вообще в любом списке объектов) может
> быть значимым для алгоритма


var
 NilObject: TObject;

initialization
 NilObject := TObject.Create;

после чего сравниваем с этим объектом на предмет пустоты объекта и с nil на предмет окончания очереди. При этом более не нужна проверка на количество объектов.


 
Игорь Шевченко ©   (2016-04-04 10:39) [16]

Dimka Maslov ©   (04.04.16 08:18) [15]

Я не до конца понимаю, зачем гордиться костылями ?


 
Dimka Maslov ©   (2016-04-04 13:29) [17]


> Игорь Шевченко ©   (04.04.16 10:39) [16]


А в чём собственно костыль?


 
Юрий Зотов ©   (2016-04-04 16:34) [18]

> Dimka Malov ©   (04.04.16 13:29) [17]

1. Заменили одну проверку другой. Стало лучше? Нет, стало хуже. Потому что сама проверка как была, так и осталась, только во втором варианте еще и спецобъект надо создавать (который, насколько я понял Игоря, костыль и есть).

3. В проект приходит новый разработчик, которому об этом спецобъекте забыли сообщить (100%, что так и будет). Бедняга честно пишет правильный код и не может понять, что за чудеса происходят в программе.


 
Dimka Maslov ©   (2016-04-04 21:49) [19]


> Юрий Зотов ©   (04.04.16 16:34) [18]


1. Мы получили указатель и сравниваем его с нулём, как признаком окончания списка или с пустым объектом, что означает, что никакие действия не нужны. При этом не надо ещё каждый раз проверять количество объектов очереди - вот лишняя и ненужная проверка. Более того, отсутствие в списке нулей избавляет от AV когда по недосмотру объект убежит туда, где его не будут проверять, либо сама проверка уже даст ошибку.

2. Сложно представить, что здеся было.

3. Правильный код - это тот, который правильно работает, а не который написан именно так, как сказано "в теории".


 
Игорь Шевченко ©   (2016-04-04 21:55) [20]

Dimka Maslov ©   (04.04.16 13:29) [17]

Костыль собственно в введении лишней сущности.

"Интересная особенность применения нулевых объектов состоит в том, что почти никогда не возникают аварийные ситуации. Поскольку нулевой объект отве¬чает на те же сообщения, что и реальный объект, система в целом ведет себя обычным образом. Из-за этого иногда трудно заметить или локализовать проблему, потому что все работает нормально."


 
Dimka Maslov ©   (2016-04-04 22:04) [21]


> Игорь Шевченко ©   (04.04.16 21:55) [20]


Что заставляет нулевой объект "отве¬чать на те же сообщения", что и реальный объект? Да и постоянные сообщения об АV в программах - тоже ничего хорошего не дают.


 
Юрий Зотов ©   (2016-04-04 23:01) [22]

> Dimka Maslov ©   (04.04.16 21:49) [19]

> отсутствие в списке нулей избавляет от AV когда по недосмотру объект
> убежит туда, где его не будут проверять


Вот это как раз и плохо, потому что AV -  это сигнал об ошибке в программе, а тут он маскируется. Почти так же плохо, как и пустой except.


 
Юрий Зотов ©   (2016-04-04 23:05) [23]

> Dimka Maslov ©   (04.04.16 22:04) [21]

> Да и постоянные сообщения об АV в программах - тоже ничего хорошего не дают.


Еще как дают! Они без всяких усилий со стороны программиста указывают на его ошибки. Что очень сильно облегчает тестирование и отладку.


 
Юрий Зотов ©   (2016-04-04 23:17) [24]

> Dimka Maslov ©   (04.04.16 21:49) [19]

> 3. Правильный код - это тот, который правильно работает,
>  а не который написан именно так, как сказано "в теории".


Верно. Но как правило, лучше работает именно тот код, который соответствует теории.

Теорию-то ведь делали далеко не дураки и не пионеры.


 
Владислав ©   (2016-04-05 07:34) [25]

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

Чем так не угодила вполне уместная проверка наличия чего-то в очереди?
Какое-то оторваное от реалий суждение с последующим бессмысленным спором с набором таких же выдуманных аргументов


 
Dimka Maslov ©   (2016-04-05 08:22) [26]


> Какое-то оторваное от реалий суждение с последующим бессмысленным
> спором с набором таких же выдуманных аргументов


Ну вот, пришёл и всё испортил. Да, смысл этого спора в самом споре. Мы тут риторикой упражняемся, а не программированием списков.


> именно тот код, который соответствует теории


Знавал я одного чувака, который пытался всё сделать по книгам и по теории. Потом ничего не работало и он прибегал ко мне за разъяснениями.


 
Юрий Зотов ©   (2016-04-05 08:38) [27]

> Dimka Maslov ©   (05.04.16 08:22) [26]

Чуваков с кривыми руками - хоть ложкой ешь. И что?


 
Dimka Maslov ©   (2016-04-05 09:38) [28]


>  И что?


Они же потом книги по теории пишут!


 
Игорь Шевченко ©   (2016-04-05 10:29) [29]

Dimka Maslov ©   (05.04.16 08:22) [26]


> который пытался всё сделать по книгам и по теории. Потом
> ничего не работало и он прибегал ко мне за разъяснениями


А ты значит от сохи сермяжной мудростью его на путь истинный ? :)


 
Dimka Maslov ©   (2016-04-05 22:13) [30]


>
> А ты значит от сохи сермяжной мудростью его на путь истинный


Зачем же, просто я говорил, что не стоит читать Страуструпа до обеда, пока голова ещё работает.


 
Игорь Шевченко ©   (2016-04-05 22:40) [31]

Dimka Maslov ©   (05.04.16 22:13) [30]

За что же ты его так не любишь - умные вещи дядька пишет.


 
Германн ©   (2016-04-06 01:19) [32]


> Dimka Maslov ©   (04.04.16 22:04) [21]
>  Да и постоянные сообщения об АV
> в программах - тоже ничего хорошего не дают.

Лично я всегда мечтал о том, чтобы при любых моих ошибках работы с памятью я бы всегда получал AV ещё на этапе отладки. Однако не всегда везло. :(



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

Форум: "Прочее";
Текущий архив: 2017.04.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.002 c
2-1438328592
Pavelnk
2015-07-31 10:43
2017.04.02
Перекинуть edit в буфер


3-1313067737
amamed_3071
2011-08-11 17:02
2017.04.02
Upgate SQL 2005 Expression to SQL 2005 Enterprice


2-1437652682
Ринсвинд
2015-07-23 14:58
2017.04.02
Запросы не поделили Buffer I/O


2-1438154511
Сергей
2015-07-29 10:21
2017.04.02
TypeCast: Set Of TEnum~ -> Cardinal


2-1438758605
lewka
2015-08-05 10:10
2017.04.02
Полная загрузка страницы в 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
Английский Французский Немецкий Итальянский Португальский Русский Испанский