Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Access Violtation в Trecord = a:array of ^Trecord


Автор: evorios 12.10.2012, 18:13
Помогите разобраться.

Так должно быть

user posted image

А так он глючит

user posted image


Код

  PFreePlace = ^TFreePlace;

  TNeighbor = record
    a: array of PFreePlace;
  end;

  TFreePlace = record
    x, y, width, height: integer;
    checked, deleted: boolean;
    neighbor: TNeighbor;
  end;

  TFree = array of TFreePlace;

  TData = record
    free: TFree;   //карта свободного места
  end;

  TCalculate = class(TThread)
    shource: TData; // исходная ветвь и конечные данные
    procedure Execute; override;
  end;

procedure TCalculate.Execute;

procedure Branch(const data: TData);

procedure ModifyFreePlaces(var free: TFreePlace);

procedure AddFreePlace(const x, y, width, height: integer);
begin
...
    if ...  SetLength(free.neighbor.a[l].neighbor.a, Length(free.neighbor.a[l].neighbor.a)+1);
...
end;

begin
...
  if ...  AddFreePlace(free.x, place.y + place.photo.height, free.width, free.y+free.height-(place.y + place.photo.height));

  for ... if ... ModifyFreePlaces(free.neighbor.a[k]^);
...
end;

begin
...
  for ... if  ...
  begin
    ...
    ModifyFreePlaces(temp.free[j]);
    ...
    Branch(temp);
  end;
...
end;

begin
  Branch(shource);
end;




Access Violtation происходит в строке:
SetLength(free.neighbor.a[l].neighbor.a, Length(free.neighbor.a[l].neighbor.a)+1);


Поможет ли мне переход от record к  class?
Или это можно как-то обойти?

Автор: DarkProg 12.10.2012, 22:02
Мнда, ничё не понятно, где что и как работает...

Одно скажу - выкиньте ненужные TRecord, потому что они даром никому не нужны, за одно и приведёте свой код в порядок.

Вот так правильно вы делаете
Код

TFree = array of TFreePlace;


А вот так нет
Код

TNeighbor = record
    a: array of PFreePlace;
  end;


Кстати не увидел выделение память под элементы PFreePlace ;)

P.S. Есть предпосылки что дорастаете до классов, так что можете попробовать перейти на классы.

Автор: northener 13.10.2012, 00:36
Цитата(evorios @  12.10.2012,  18:13 Найти цитируемый пост)
Поможет ли мне переход от record к  class?

Возможно поможет.
Но для начала понимания объясните (для себя в первую очередь, а во-вторую для нас) значения параметров вот в этой процедуре:
Код

SetLength(free.neighbor.a[l].neighbor.a, Length(free.neighbor.a[l].neighbor.a)+1);

И что она по вашему делает?

Автор: Чучмек 13.10.2012, 08:33
evorios, все как сказал DarkProg.
Где выделяется память под free.neighbor.a[l] ??? 

Цитата(evorios @  12.10.2012,  18:13 Найти цитируемый пост)
SetLength(___.a, Length(___.a)+1);

Будешь добавлять по одному элементу за раз, быстро заездишь лошадку.

Автор: evorios 16.10.2012, 11:36
Вот первоначальный вариант. С записью а я экспериментировал.

Код

  SetLength(temp.free[High(temp.free)].neighbor, Length(free.neighbor));
  m := 0;
  for l:= Low(free.neighbor) to High(free.neighbor) do
    if not free.neighbor[l].deleted and not ( //если сосед не удален и как-то пересекается
     (free.neighbor[l].x > temp.free[High(temp.free)].x + temp.free[High(temp.free)].width) or (free.neighbor[l].x + free.neighbor[l].width < temp.free[High(temp.free)].x) or
     (free.neighbor[l].y > temp.free[High(temp.free)].y + temp.free[High(temp.free)].height) or (free.neighbor[l].y + free.neighbor[l].height < temp.free[High(temp.free)].y)
     ) then begin
     //добавить условия для удаления той или иной области в случае полного перекрытия
      temp.free[High(temp.free)].neighbor[m] := free.neighbor[l];
      SetLength(free.neighbor[l].neighbor, Length(free.neighbor[l].neighbor)+1);
      free.neighbor[l].neighbor[High(free.neighbor[l].neighbor)] := PFreePlace(@temp.free[High(temp.free)]);
      inc(m);
    end;
  SetLength(temp.free[High(temp.free)].neighbor, m);

  SetLength(free.neighbor, Length(free.neighbor)+1);
  free.neighbor[High(free.neighbor)] := PFreePlace(@temp.free[High(temp.free)]);



Как видно из данного кода не важно выделено место под free.neighbor[l] или нет.
Элементы temp.free создаются уровнем выше.

Я ответил на все вопросы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)