![]() |
|
|
Регистрация | << Правила форума >> | 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
|
||||
|
||||
![]() Раз уже отследил, откуда ошибка лезет, попробуй прошагать Дебагером.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
|||
|
|||
![]() а что именно смотреть в дебагере?
отследил итак выполняя пошагово прогу |
#4
|
||||
|
||||
![]() Ты сказал, что выяснил в какой момент происходит сбой, вот этот момент и прошагай.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#5
|
|||
|
|||
![]() ну вот, на моменте SetLength(PosList,0);
или чтото другое имеешь ввиду? непонимаю,как прошагать? там где ассемблерный код показан? я там ниче не понимаю... |
#6
|
||||
|
||||
![]() Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#7
|
|||
|
|||
![]() не,ассемблер мне не надо спасибо) подождем может еще кто что скажет
|
#8
|
||||
|
||||
![]() Цитата:
А по делу - сложно узнать без кода. Все получается абстрактно и непонятно. jmp $ ; Happy End! The Cake Is A Lie. |
#9
|
||||
|
||||
![]() Вообще, обнулять динамический массив нет нужды, если только это не требование задачи. Можешь присвоить массиву NIL.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#10
|
|||
|
|||
![]() ну у меня получается требование задачи.потому что там в некоторых местах исходя из длинны массива действия определенные происходят,можно конечно зайдействовать переменные для этого,но сейчас переделывать всю программу ох как не хочется.
Последний раз редактировалось Snake22, 14.10.2011 в 21:03. |
#11
|
||||
|
||||
![]() Посмотрим на досуге.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#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; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |