Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2011, 23:15   #1
eatlant
 
Регистрация: 11.04.2011
Сообщений: 9
По умолчанию Access violation at adress...

Код:
type pcell=^cell;
     cell=record
     i,j:Integer;
     next:pcell;
procedure delete_list(var pc:pcell);
var pc2,pc3:pcell;
begin
pc^.i:=0;
pc2:=pc^.next;
new(pc2);new(pc3);
while pc2<>nil do begin
 pc3:=pc2; pc2:=pc2^.next; dispose(pc3); 
 end;
dispose(pc2);
end;
В этом месте вылетает ошибка. Подскажите, в чем проблема?
В списке всегда есть хотя бы 1 эл-т.
eatlant вне форума Ответить с цитированием
Старый 11.04.2011, 23:42   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

В том, что написан бред.

Ты создал новую запись: new(pc2); и тут же, не инициализировав её, читаешь из неё поле next: pc2:=pc2^.next; Поскольку pc2^.next у тебя указывает в космос (там мусор), то вторая итерация цикла вылетит при попытке дереференса pc2.

Не менее бредово выглядит и такая последовательность кода:

Код:
new(pc3);
...
pc3:=pc2;
...
dispose(pc3);
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 11.04.2011, 23:47   #3
eatlant
 
Регистрация: 11.04.2011
Сообщений: 9
По умолчанию

сначала было так, то я уже пробывал:
Код:
procedure delete_list(var pc:pcell);
var pc2,pc3:pcell;
begin
pc^.i:=0;
pc2:=pc^.next;
while pc2<>nil do begin
 pc3:=pc2; pc2:=pc2^.next; dispose(pc3);
 end;
end;
и как это не инициализировал pc2?
Код:
pc2:=pc^.next;
подскажите, как тогда удалить весь список кроме первого элемента?
eatlant вне форума Ответить с цитированием
Старый 12.04.2011, 02:28   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от eatlant Посмотреть сообщение
сначала было так, то я уже пробывал:
А это было правильно. pc^.next только забыл обнулить.

Цитата:
Сообщение от eatlant Посмотреть сообщение
и как это не инициализировал pc2?
Чему, по-твоему, у тебя равно pc2^.next после строчки new(pc2)?

Цитата:
Сообщение от eatlant Посмотреть сообщение
подскажите, как тогда удалить весь список кроме первого элемента?
Код:
procedure DeleteList(Head: PCell);
var
  Current: PCell;
  Next: PCell;
begin
  Current := Head^.Next;

  Head^.i := 0;
  Head^.Next := nil;

  while Current <> nil do 
  begin
    Next := Current^.Next; 
    Dispose(Current);
    Current := Next;
  end;
end;
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 12.04.2011, 12:34   #5
eatlant
 
Регистрация: 11.04.2011
Сообщений: 9
По умолчанию

Спасибо!
Теперь работает.
eatlant вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
access violation at address UnChanter Общие вопросы Delphi 22 07.02.2011 11:00
Ошибка access violation at adress Godod Помощь студентам 2 02.02.2011 11:11
Получаю ошибку Access violation at adress fs444 Общие вопросы C/C++ 9 16.12.2009 08:04
Access Violation SunKnight Общие вопросы Delphi 2 05.06.2008 16:46
Access Violation Carbon Общие вопросы Delphi 12 18.09.2007 19:55