Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.025 c
3-1108617284
Submarine
2005-02-17 08:14
2005.03.20
Проблемка с выбором последней записи


14-1109436920
olookin
2005-02-26 19:55
2005.03.20
Чем дальше в лес...


14-1109832313
WondeRu
2005-03-03 09:45
2005.03.20
Что вы знаете интересного про ТуркменБаши?


14-1109790550
Jetus
2005-03-02 22:09
2005.03.20
Как работает Morphine?


1-1110361953
Kirill
2005-03-09 12:52
2005.03.20
Использование 7-zip




   Наверх