![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление элемента из списка [D7, XP]
yagluboko © (2010-04-10 14:54:00)Пожалуйста, помогите, никак не могу написать процедуру, то тут то там какой- то глюк выдаёт:
procedure TForm1.Del(d: string; var Poin: PNode);
var
PoinDel, r: PNode;
begin
if Poin^.Info.Name = d then
begin
PoinDel := Poin;
Poin := Poin^.Next;
Dispose (PoinDel);
end else
begin
q := Poin^.Next;
r := Poin;
while (q^.Next <> nil) do
begin
if q^.Info.Name = d then
begin
PoinDel := q^.Next;
q^.Info := PoinDel^.Info;
q^.Next := PoinDel^.Next;
Dispose (PoinDel);
Break;
end else
r := q;
q := q^.Next;
end;
if q^.Next = nil then
begin
r^.Next := q^.Next;
Dispose (q);
end;
end;
end;
Работает только еслди данный элемент в списке первый, и то в StringGrid
остальной список записывает, а в файл нет. Если же ничего не удалять, то в файл весь список записывается и потом читается корректно
Anatoly Podgoretsky (2010-04-10 16:14:00) [1]А что теперь случилось, ведь раньше же было
> Если это первый элемент или какой- нибудь кроме последнего,
> всё работает, на последнем же программа залипает:
И ты получил ответ, что для последнего элемента.
q := Poin^.Next; q = nil// q^.Next недопустимо, поскольку получается nil^.Next
PoinDel := Poin;
while (q^.Next <> nil) do
Toombaa Yoombaa (2010-04-10 15:22:00) [2]то тут то там какой- то глюк выдаёт
Глюк у тебя в другом месте. Ты даже сформулировать, что тебе надо - не можешь.
procedure TForm1.Del(d: string; var Poin: PNode);
var
PoinDel, r: PNode;
begin
if Poin^.Info.Name = d then // Ты уверен, что Poin <> nil? Хочешь AV?
begin
PoinDel := Poin;
Poin := Poin^.Next; // Здесь Poin может стать равным nil
Dispose (PoinDel);
end else
begin
q := Poin^.Next; // И снова, ты уверен, что Poin <> nil?
r := Poin;
while (q^.Next <> nil) do // Ты уверен, что q <> nil?
begin
if q^.Info.Name = d then // Снова
begin
PoinDel := q^.Next; // И еще раз
q^.Info := PoinDel^.Info; // И еще
q^.Next := PoinDel^.Next; // И еще
Dispose (PoinDel);
Break;
end else
r := q;
q := q^.Next; // Тут q может стать nil
end;
if q^.Next = nil then // И опять обращение к q без проверки?!
begin
r^.Next := q^.Next; // Уф...
Dispose (q);
end;
end;
end;
На какую структуру указывает PNode? Как это все хранится в памяти? Где объявлена q? И еще куча вопросов. Давай сюда весь код, а то то, что ты привел - просто какой-то тихий ужас.