Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.10.2011, 22:04
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию при работе с массивами ошибка

здраствуйте.
у мя в программе используется несколько динамических массивов.постоянно идёт с ними работа.
и в одном месте при попытке сделать массив нулевым ( setlength(PosList,0) ) пишет Invalid Pointer Operation и дальше при размер не изменяется. (проверял кнопочкой через ShowMessage(IntToStr(Length(PosList)));
но при этом при попытке считать значения/записать/изменить длинну массива нельзя, ерроры сыпятся.
случилось это после того как создал еще один массив.
Ошибок типа записи в несуществующий элемент массива нету точно.
один чел сказал что это может быть из-за грязно-инициализированных массивов,я честно непонял как это понять.
массивы создаю обычным путём (типа PosList: array of Integer; )
почти везде длинна увеличивается следующим путём SetLength(PosList,Length(Poslist)+1);.
И еще заметил,если эта процедура,в которой присутствует строка setlength(PosList,0) вызывается из другого места программы,то всё норм,а из еще одного места уже ошибка,ну естественно после появления ошибки,обращение к массиву из любого места выдает ошибку.и при закрытии программы тоже.
Что это может быть,почему? может это из-за того что используется много динамических массивов и приложение наичнает в них путаться?
В данном случае именно ошибок в коде точно нет,я уверяю.разме что дейтсвительно массивы инициализированы грязно (хз как понять))
Ответить с цитированием
  #2  
Старый 13.10.2011, 22:12
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Раз уже отследил, откуда ошибка лезет, попробуй прошагать Дебагером.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 13.10.2011, 22:20
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

а что именно смотреть в дебагере?
отследил итак выполняя пошагово прогу
Ответить с цитированием
  #4  
Старый 13.10.2011, 22:22
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ты сказал, что выяснил в какой момент происходит сбой, вот этот момент и прошагай.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 13.10.2011, 22:26
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

ну вот, на моменте SetLength(PosList,0);
или чтото другое имеешь ввиду?
непонимаю,как прошагать?
там где ассемблерный код показан? я там ниче не понимаю...
Ответить с цитированием
  #6  
Старый 13.10.2011, 22:30
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Snake22
...а из еще одного места уже ошибка,...
Да, там где ассемблер. Ну а то, что не понимаешь не беда, подучишь.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #7  
Старый 13.10.2011, 22:36
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

не,ассемблер мне не надо спасибо) подождем может еще кто что скажет
Ответить с цитированием
  #8  
Старый 13.10.2011, 22:50
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Сообщение от Snake22
не,ассемблер мне не надо спасибо)
Не могу удержаться и не сказать: ОЧЕНЬ ЗРЯ.
А по делу - сложно узнать без кода. Все получается абстрактно и непонятно.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #9  
Старый 13.10.2011, 22:55
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Вообще, обнулять динамический массив нет нужды, если только это не требование задачи. Можешь присвоить массиву NIL.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #10  
Старый 13.10.2011, 23:29
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

ну у меня получается требование задачи.потому что там в некоторых местах исходя из длинны массива действия определенные происходят,можно конечно зайдействовать переменные для этого,но сейчас переделывать всю программу ох как не хочется.

Последний раз редактировалось Snake22, 14.10.2011 в 21:03.
Ответить с цитированием
  #11  
Старый 13.10.2011, 23:39
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Посмотрим на досуге.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #12  
Старый 14.10.2011, 11:25
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

всё ребят отбой стал делать дальше,чутка изменена работа с массивами,и ошибка пропала. так и не знаю почему появлялась
Ответить с цитированием
  #13  
Старый 14.10.2011, 21:43
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

И всё равно, пару слов скажу:
Код:
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 в.д.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:21.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025