Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Потеря указателей.

9.4K
12 мая 2008 года
AIGrifon
165 / / 13.11.2007
Уже дважды столкнулся с проблемой изменения значения указателя приего чтении.

Впервые - при работе с красно-черными деревьями. Имелся набор типов для реализации:

[highlight=Delphi]
TData = Integer;

TRBColor = (Black,Red);

TLink = ^TSummit;
TSummit = record
Data : TData;
Color : TRBColor;

Left : TLink;
Right : TLink;
Parent : TLink;
end;
[/highlight]

и процедура вращения:
Код:
procedure Right_Rotate(var Root : TLink;var X : TLink);
var
  Aid : TLink;
begin
  if Empty(Root) then exit;
  if X^.Left = nil then exit;

  [COLOR="Red"]Aid := X^.Left;[/COLOR]
  X^.Left := Aid^.Right;

  if Aid^.Right <> nil then
    Aid^.Right^.Parent := X;
  Aid^.Parent := X^.Parent;

  if X^.Parent = nil then Root := Aid
  else
    if X = X^.Parent^.Right then
      X^.Parent^.Right := Aid
    else
      X^.Parent^.Left := Aid;

  Aid^.Right := X;
  X^.Parent  := Aid;
end;


После выполнения помеченной строчки значение указателя X теряется и дальнейшая работа с ним невозможна. Проблема решалась изменением заголовка на:

[highlight=Delphi]
procedure Right_Rotate(var Root : TLink; X : TLink);
[/highlight]

Во втором случае имеется матрица, с которой работает несколько объектов. Каждому из них передан указатель на нее. Проблема аналогична - после первого чтения указатель теряется.

Долго разбирался, но так и не смог понять, почему такое происходит. Если кто-то знает - подскажите.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог