![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Указатели
aka © (2016-04-07 10:13:00)Пришлось править чужой исходник.
Кратко суть проблемы
Next := First;
while Next <> Last do begin
{143 строки кода разных действий с Next}
Next := Next.Child[DLeft]
end;
Last - тут естественно под while не попадает (в этом и был скрытый баг)
получается что нужно брать Last и дописывать для него отдельно после while все то что было в теле цикла для Next.
han_malign (2016-04-08 16:08:00) [1]
> Это шутка такая что ли?
- а еще лучше
process(Next .value);
- чтобы гарантировать семантическую изоляцию работы с данными от реализации контейнера...
и тогда коментарий будет выглядеть:
{пофиг сколько там строк кода, т.к манипуляций с Nextне происходит}
sniknik (2016-04-08 08:46:00) [2]> Это шутка такая что ли?
?
загнать в процедуру 143 строчки кода, и вызвать ее 2 раза? нет не шутка. нормальное решение.
хотя я бы сделал так, при условии что Last.Child[DLeft] возвращает nil, а оно вроде так и делается в указателях/списках из них, "концевики" инициализируются nil-ом.
тогда очевидно, и без лишних условий/процедур.
Next := First;
while Assigned(Next) do begin
{143 строки кода разных действий с Next}
Next := Next.Child[DLeft]
end;
и да, First на пустой структуре тоже nil должен возвращать.
Германн (2016-04-08 01:46:00) [3]
> han_malign © (07.04.16 15:43) [4]
>
>
> > получается что нужно брать Last и дописывать для него
> отдельно
>
> - почувствуй силу декомпозиции, Люк...
Это шутка такая что ли?
han_malign (2016-04-07 15:43:00) [4]
> получается что нужно брать Last и дописывать для него отдельно
- почувствуй силу декомпозиции, Люк...
Next := First;
while Next <> Last do begin
process(Next);
Next := Next.Child[DLeft]
end;
process(Last);
Игорь Шевченко (2016-04-07 13:43:00) [5]repeat...until
Ринсвинд (2016-04-07 12:00:00) [6]Разумеется, при условии что Next не присваивается новый объект в тех 143 строчках кода.
Ринсвинд (2016-04-07 11:55:00) [7]
Next := First;
while true do begin
{143 строки кода разных действий с Next}
if Next = Last then
break;
Next := Next.Child[DLeft]
end;