Главная страница
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.033 c
1-1109870167
ТехникПТО
2005-03-03 20:16
2005.03.20
Как работать с TStrings


3-1108566889
Gost
2005-02-16 18:14
2005.03.20
Как остановить просмотр таблицы?


4-1107328870
Игорь Шевченко
2005-02-02 10:21
2005.03.20
Любителям "скырть процесс" под NT посвящается...


14-1109746427
Cosinus
2005-03-02 09:53
2005.03.20
Как проверить скорость доступа к сайту?


6-1105938265
Kacnep
2005-01-17 08:04
2005.03.20
Разбираюсь с ФТП. Пробовал компоненты ФастНета и Инди.