Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.20;
Скачать: CL | DM;

Вниз

Не пойму где глюк с массивом.   Найти похожие ветки 

 
Pavelkq   (2005-03-05 10:06) [0]

Здравствуйте! Имею динамический массив Indexes. Сравниваю его с одной переменной и если она оказывается больше надо удалить текущий элемент массива со сдвигом вверх (нулевой элемент не сравнивается и не меняется никогда). Вот код (все переменные типа Integer)
 
Set1:=1;
 i2:=MaxInd;//Round(MaxInd*(100-Form1.TrackBar1.Position)/100);
 While Set1 < EndInd do
 begin
   i1:=Indexes[Set1].Index;
   if i1 <= i2 then
  {&#209;&#228;&#226;&#232;&#227; &#236;&#224;&#241;&#241;&#232;&#226;&#224; &#237;&#224; 1 &#226;&#226;&#229;&#240;&#245; &#238;&#242; &#239;&#238;&#231;&#232;&#246;&#232;&#232; Set1}//*
   begin                                    //*
     Set2:=Set1+1;                          //*
     While Set2 <= EndInd do                //*
     begin                                  //*
       Indexes[Set2-1]:=Indexes[Set2];      //*
       Inc(Set2);                           //*
     end;                                   //*
     Dec(EndInd);                           //*
     Dec(Set1);                             //*
   end;                                     //*
  //*******************************************
 Inc(Set1);
 end;
 SetLength(Indexes,EndInd);

 Данный кусок кода проходит без ошибок, но потом вылетают на ровном месте ошибки (а именно на последнем end Access violation at adress 00401F0E in module "test.exe". Write at adress 00000007. При попытке закрыть приложение выдается ошибка "Invalid pointer operation". Если заремить весь кусок, дальше тоже все работет безупречно.


 
begin...end ©   (2005-03-05 10:10) [1]

> Pavelkq   (05.03.05 10:06)

Что такое EndInd?


 
Pavelkq   (2005-03-05 10:18) [2]

EndEnd - это переменная сыитающая конец массива. Аналог High(Indexes)


 
evvcom ©   (2005-03-05 10:18) [3]

По строке SetLength(Indexes,EndInd); ясно, что у автора путаются понятия последнего индекса и длины массива. Длина массива всегда на 1 больше последнего индекса в динам. массиве, так как индекс первого элемента = 0.


 
Pavelkq   (2005-03-05 10:20) [4]

EndInd, конечно, тороплюсь...


 
Pavelkq   (2005-03-05 10:24) [5]

Да, точно подзабыл этот момент, но суть не меняется. В худшем случае в массиве остается только 1 элемент, т.е. нулевой. При этом SetLength(Indexes,1); срабатывает верно.


 
begin...end ©   (2005-03-05 10:25) [6]

> Pavelkq   (05.03.05 10:18) [2]

> Аналог High(Indexes)

Точно? Сравните EndInd, High(Indexes) и Length(Indexes). Если EndInd - это всё же длина, то ошибка есть, по крайней мере,  вусловии вложенного цикла: While Set2 <= EndInd do.


 
Pavelkq   (2005-03-05 10:32) [7]

А-а-а-а, допетрил! Не понял почему, но у меня в коде было
While Set1 <= EndInd do
а надо именно
While Set1 < EndInd do
Спасибо evvcom за наведение на мысль!


 
evvcom ©   (2005-03-05 10:39) [8]

Я могу больше сказать. Второй цикл (внутренний) вообще лишний. Move + F1 еще тебе поможет.



Страницы: 1 вся ветка

Текущий архив: 2005.03.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.024 c
3-1108569676
td
2005-02-16 19:01
2005.03.20
поганый символ базу испортил


1-1109924669
webpauk
2005-03-04 11:24
2005.03.20
Program Files


3-1108727003
Dimedrol
2005-02-18 14:43
2005.03.20
Extended St.Proc. for MS SQL


3-1108698060
Ярослав
2005-02-18 06:41
2005.03.20
FireBird Embeded &amp; Win98


3-1108841691
Bogdan
2005-02-19 22:34
2005.03.20
Отсортировать по дате