Вниз
Скачать: 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.024 c
6-1105707982
begemon
2005-01-14 16:06
2005.03.20
Как определить момент, когда модем установил соединение


3-1108850653
beda
2005-02-20 01:04
2005.03.20
MS Access, Delphi, ADO - Unspecified error


14-1109459358
Копир
2005-02-27 02:09
2005.03.20
Деликатный вопрос. Девушкам не читать!


6-1101368472
Жуков
2004-11-25 10:41
2005.03.20
Сообщения по локальной сети


6-1106037574
y0zh
2005-01-18 11:39
2005.03.20
Ethernet (отослать что-угодно, а потом получить ответ)




   Наверх