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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2012, 22:01   #1
boberb
Новичок
Джуниор
 
Регистрация: 16.03.2012
Сообщений: 5
По умолчанию Сортировки и динамический массив(Delphi)

На форме накидано 2 стринггрида. 1 спин эдит и кнопка. В стринг гриде1 - исходный массив, в стринггриде 2 - отсортированный, нужно отсортировать пирамидальной сортировкой, используя динамический массив, вот фрагмент кода
Код:
procedure TForm1.Button6Click(Sender: TObject);
var
    V,W:Dynvect;
    i:integer;
    d:string;
begin
  SetLength(V,Spinedit1.Value);
  for i:=0 to spinedit1.Value-1 do
  v[i]:=strtofloat(stringgrid1.cells[i,0]);
//создаем новій динамический массив W, чтобы избежать путаницы с 
//индексацией в сортировке
  setlength(W,length(v)+1);
  for i:=0 to length(v)-1 do
  w[i]:=v[i];
  w[length(v)]:=0;
  Heapsort(w);
    for i:=0 to m-1 do
        v[i]:=w[i];
  stringgrid2.ColCount:=spinedit1.Value;
    for i:=0 to m-1 do
       begin
       d:=floattostr(v[i]);
      StringGrid2.Cells[i,0]:=d;
      end;
end;
вот код сортировки
Код:
//------------------------------ПИРАМИДАЛЬНАЯ
//дополнительніе функции для вічисления дочерних элементов
function LEFT(i:integer):integer;
  begin
     result:=2*i;
  end;
function RIGHT(I:integer):integer;
  begin
    result:=2*i+1;
  end;
function PARENT(I:integer):integer;
  begin
    result:=i div 2;
  end;
//процедура проверки основного свойства кучи
procedure Max_Heapify(var A:DynVect;Index:integer);
var L,R,largest:Integer;
begin
l:=left(Index);r:=right(Index);
if (l<=heap_size) and (a[l]>a[Index])
  then largest:=l
  else largest:=Index;
if (r<=heap_size) and (a[r]>a[largest])
  then largest:=r;
if largest<>Index then
  begin
  swap(a[Index],a[largest]);
  max_heapify(a,largest);
  end;
end;
//процедура построения максимальной кучи
procedure Build_Max_Heap(var A:DynVect);
var i:integer;
begin
  heap_size:=length(a)-1;
  for i:=((length(a)-1) div 2) downto 1 do
  max_heapify(a,i);
end;
//сама сортировка
procedure Heapsort(var a:Dynvect);
var I:integer;
begin
//----Перенумерация динамического массива
  for i:=length(a) downto 1 do
  a[i]:=a[i-1];
  a[0]:=0;
//------
Build_max_heap(a);
//heap_size:=heapsize(a,1);
for i:=Length(a)-1 downto 2 do
  begin
  swap(a[1],a[i]);
  heap_size:=heap_size-1;
  max_heapify(a,1);
  end;
//----Обратная нумерация
for i:=0 to length(a)-1 do
a[i]:=a[i+1];
a[length(a)]:=0;
//-------
end;
Собственно, ошибка возникает при заполнении стринггрид2.
Invalid Pointer Operation
что бы это могло быть?
boberb вне форума Ответить с цитированием
Старый 16.03.2012, 22:17   #2
boberb
Новичок
Джуниор
 
Регистрация: 16.03.2012
Сообщений: 5
По умолчанию

теперь же пишет Acess Violation
boberb вне форума Ответить с цитированием
Старый 17.03.2012, 18:07   #3
boberb
Новичок
Джуниор
 
Регистрация: 16.03.2012
Сообщений: 5
По умолчанию

товарищи, помогите, пожалуйста)
boberb вне форума Ответить с цитированием
Старый 17.03.2012, 18:10   #4
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

Пошагово запустите процедуру, и смотрите где за пределы вылазит.

PS
Скинте проект если не получится найти, попробую разобраться.

Последний раз редактировалось vovk; 17.03.2012 в 18:12.
vovk вне форума Ответить с цитированием
Старый 17.03.2012, 18:32   #5
boberb
Новичок
Джуниор
 
Регистрация: 16.03.2012
Сообщений: 5
По умолчанию

Цитата:
Сообщение от vovk Посмотреть сообщение
Пошагово запустите процедуру, и смотрите где за пределы вылазит.

PS
Скинте проект если не получится найти, попробую разобраться.
я делал уже пошагово, но ничего отследить не смог, тк за пределы ничего не вылазит(вроде)

http://zalil.ru/32895273
вот сам проект, но там чуть больше того, что я написал в начальном сообщении)
boberb вне форума Ответить с цитированием
Старый 17.03.2012, 20:20   #6
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

посмотрите внимательно процедуру procedure Heapsort(var a:Dynvect);

в 2 местах попытка выползти за пределы массива.
vovk вне форума Ответить с цитированием
Старый 19.03.2012, 18:30   #7
boberb
Новичок
Джуниор
 
Регистрация: 16.03.2012
Сообщений: 5
По умолчанию

Цитата:
Сообщение от vovk Посмотреть сообщение
посмотрите внимательно процедуру procedure Heapsort(var a:Dynvect);

в 2 местах попытка выползти за пределы массива.
а конкретно в ней или в дополнительных процедурах?
я проследил выход за пределы только в перенумерациях, еще есть где-нибудь?

Последний раз редактировалось boberb; 19.03.2012 в 19:10.
boberb вне форума Ответить с цитированием
Старый 20.03.2012, 04:49   #8
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

Код:
procedure Heapsort(var a:Dynvect);
var I:integer;
begin
//----Перенумерация динамического массива
  for i:=length(a) downto 1 do
  a[i]:=a[i-1];
  a[0]:=0;
//------
Build_max_heap(a);
//heap_size:=heapsize(a,1);
for i:=Length(a)-1 downto 2 do
  begin
  swap(a[1],a[i]);
  heap_size:=heap_size-1;
  max_heapify(a,1);
  end;
//----Обратная нумерация
for i:=0 to length(a)-1 do
a[i]:=a[i+1];
a[length(a)]:=0;
//-------
end;
vovk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на двумерный динамический массив Delphi molodoy95 Помощь студентам 3 26.12.2011 22:05
Динамический массив в Delphi kop Помощь студентам 1 29.10.2011 21:15
прога на динамический массив на Delphi realinkxxx Помощь студентам 2 29.04.2010 03:55
Динамический массив и FileMapping (delphi) bug Win Api 0 08.10.2009 18:42