Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаление элемента из списка [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
   PoinDel := Poin;
   while (q^.Next <> nil) do
  // q^.Next недопустимо, поскольку получается nil^.Next


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? И еще куча вопросов. Давай сюда весь код, а то то, что ты привел - просто какой-то тихий ужас.


Наверх

Титульная страница Поиск, карта сайта Написать письмо