Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизУдаление элемента из списка Найти похожие ветки
← →
yagluboko © (2010-04-10 14:54) [0]Пожалуйста, помогите, никак не могу написать процедуру, то тут то там какой- то глюк выдаёт:
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
остальной список записывает, а в файл нет. Если же ничего не удалять, то в файл весь список записывается и потом читается корректно
← →
Toombaa Yoombaa (2010-04-10 15:22) [1]то тут то там какой- то глюк выдаёт
Глюк у тебя в другом месте. Ты даже сформулировать, что тебе надо - не можешь.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? И еще куча вопросов. Давай сюда весь код, а то то, что ты привел - просто какой-то тихий ужас.
← →
Anatoly Podgoretsky © (2010-04-10 16:14) [2]А что теперь случилось, ведь раньше же было
> Если это первый элемент или какой- нибудь кроме последнего,
> всё работает, на последнем же программа залипает:
И ты получил ответ, что для последнего элемента.q := Poin^.Next; q = nil
// q^.Next недопустимо, поскольку получается nil^.Next
PoinDel := Poin;
while (q^.Next <> nil) do
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.053 c