![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
здраствуйте.
у мя в программе используется несколько динамических массивов.постоянно идёт с ними работа. и в одном месте при попытке сделать массив нулевым ( setlength(PosList,0) ) пишет Invalid Pointer Operation и дальше при размер не изменяется. (проверял кнопочкой через ShowMessage(IntToStr(Length(PosList))); но при этом при попытке считать значения/записать/изменить длинну массива нельзя, ерроры сыпятся. случилось это после того как создал еще один массив. Ошибок типа записи в несуществующий элемент массива нету точно. один чел сказал что это может быть из-за грязно-инициализированных массивов,я честно непонял как это понять. массивы создаю обычным путём (типа PosList: array of Integer; ) почти везде длинна увеличивается следующим путём SetLength(PosList,Length(Poslist)+1);. И еще заметил,если эта процедура,в которой присутствует строка setlength(PosList,0) вызывается из другого места программы,то всё норм,а из еще одного места уже ошибка,ну естественно после появления ошибки,обращение к массиву из любого места выдает ошибку.и при закрытии программы тоже. Что это может быть,почему? может это из-за того что используется много динамических массивов и приложение наичнает в них путаться? В данном случае именно ошибок в коде точно нет,я уверяю.разме что дейтсвительно массивы инициализированы грязно (хз как понять)) |
|
#2
|
||||
|
||||
|
Раз уже отследил, откуда ошибка лезет, попробуй прошагать Дебагером.
|
|
#3
|
|||
|
|||
|
а что именно смотреть в дебагере?
отследил итак выполняя пошагово прогу |
|
#4
|
||||
|
||||
|
Ты сказал, что выяснил в какой момент происходит сбой, вот этот момент и прошагай.
|
|
#5
|
|||
|
|||
|
ну вот, на моменте SetLength(PosList,0);
или чтото другое имеешь ввиду? непонимаю,как прошагать? там где ассемблерный код показан? я там ниче не понимаю... |
|
#6
|
||||
|
||||
|
Цитата:
|
|
#7
|
|||
|
|||
|
не,ассемблер мне не надо спасибо) подождем может еще кто что скажет
|
|
#8
|
||||
|
||||
|
Цитата:
А по делу - сложно узнать без кода. Все получается абстрактно и непонятно. |
|
#9
|
||||
|
||||
|
Вообще, обнулять динамический массив нет нужды, если только это не требование задачи. Можешь присвоить массиву NIL.
|
|
#10
|
|||
|
|||
|
ну у меня получается требование задачи.потому что там в некоторых местах исходя из длинны массива действия определенные происходят,можно конечно зайдействовать переменные для этого,но сейчас переделывать всю программу ох как не хочется.
Последний раз редактировалось Snake22, 14.10.2011 в 21:03. |
|
#11
|
||||
|
||||
|
Посмотрим на досуге.
|
|
#12
|
|||
|
|||
|
всё ребят отбой
стал делать дальше,чутка изменена работа с массивами,и ошибка пропала. так и не знаю почему появлялась |
|
#13
|
||||
|
||||
|
И всё равно, пару слов скажу:
Код:
procedure TForm1.DeleteIco;
...
if tmp = Length(Ims) - 1 then //если в данной папке перемещаем последнюю папку то тег не получиться взят от следующей иконки
buf := Copy(MainT.text, Ims[tmp].Tag, LastFpos - ims[tmp].Tag) //для этого есть last icon pos
else
buf := Copy(MainT.text, Ims[tmp].Tag,Ims[tmp + 1].tag - Ims[tmp].Tag)//текст выделенной иконки
// Когда сюда попадёт условие выборки?
else //если приложеине то скопируем тег до символа >
buf := Copy(MainT.text, ims[tmp].Tag, PosEx('>', MainT.Text, ims[tmp].Tag) + 1 - Ims[tmp].Tag);
...
// Предположим, что длина Poslist = 2. Тогда при первой итерации идёт обращение Poslist[1], а уже при 2!!! - Poslist[3]. Откуда массив длиной в 2 единицы (0..1) возьмёт 3, то есть длину массива = 4!!! (0..3)
for j := 0 to Length(PosList) - 1 do
PosList[j * 2 + 1] := Poslist[j * 2 + 1] - SelectedIcons[i + 1];//укорачиваем позиции всех открытых папок
...
end;
procedure TForm1.MoveContnt(Sender: TObject);
...
// тоже, что и в предыдущем случае
for j := 0 to Length(PosList) - 1 do
PosList[j * 2] := Poslist[j * 2] + length(buf); // обновляем позиции всех открытых папок
...
end;
|