Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Access Violtation в Trecord = a:array of ^Trecord, код Шредингера 
:(
    Опции темы
evorios
Дата 12.10.2012, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 17.9.2009

Репутация: 1
Всего: 1



Помогите разобраться.

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

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?
Или это можно как-то обойти?

Это сообщение отредактировал(а) evorios - 12.10.2012, 18:31
PM MAIL   Вверх
DarkProg
Дата 12.10.2012, 22:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



Мнда, ничё не понятно, где что и как работает...

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

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

TFree = array of TFreePlace;


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

TNeighbor = record
    a: array of PFreePlace;
  end;


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

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


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
northener
Дата 13.10.2012, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



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

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

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

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


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Чучмек
Дата 13.10.2012, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 7
Всего: 41



evorios, все как сказал DarkProg.
Где выделяется память под free.neighbor.a[l] ??? 

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

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



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
evorios
Дата 16.10.2012, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 17.9.2009

Репутация: 1
Всего: 1



Вот первоначальный вариант. С записью а я экспериментировал.

Код

  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 создаются уровнем выше.

Я ответил на все вопросы.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0682 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.