![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Сообщение о ошибке с текстом Invalid pointer operation выскакивает после выполнения программы. Программа делает медианную фильтрацию- устраняет шум изображений, размер каретки устанавливаю я (нюанс метода фильтрации), при этом использую динамические массивы, до этого каретка в фильтрации была 3х3 и массивы были статические ошибки не было. Прошу подсказать почему выскакивает ошибка.
Вот полностью главный юнит http://depositfiles.com/files/ivq005c7g http://4ppl.ru/162538 Вот сама программа http://4ppl.ru/162539 Ниже код процедуры самой фильтрации Код:
procedure TMainForm.Filter1Click(Sender: TObject); var i,j,k,l,r,q,g,b,w,ser:integer; t:boolean; vecr:array of integer; br:array of array of integer; can:byte; begin setlength (vecr,si*si); setlength (br,si,si); if fl1 then pb.Min:=0; pb.Max:=bmp.Width-1; pb.Position:=0; begin for i:=0 to paintbox.Width-2 do begin for j:=0 to paintbox.Width-2 do begin for k:=0 to si-1 do // обнуление массиовов begin for l:=0 to si-1 do begin br[k,l]:=0; end; end; for k:=0 to si-1 do // Расчёт значения каждого канала в маске begin for l:=0 to si-1 do begin can:=paintbox.Canvas.Pixels[i+k,j+l]; r:=getrvalue(can); g:=getgvalue(can); b:=getbvalue(can); br[k,l]:=trunc(sqrt(r*r+g*g+b*b)); end; end; q:=0; for k:=0 to si-1 do // переписываем полученные значения каналов begin // в маске, в вектор для последующей их сортировки for l:=0 to si-1 do begin q:=q+1; vecr[q]:=br[k,l]; end; end; t :=true; while t do begin t:=false; for k:=1 to si*si-1 do //метод пузырька begin if vecr[k]>vecr[k+1] then begin w:=vecr[k]; vecr[k]:=vecr[k+1]; vecr[k+1]:=w; t:=true; end; end; end; ser:=(trunc((si*si)/2))+1; paintbox1.Canvas.Pixels[i+1,j+1]:=rgb(vecr[ser],vecr[ser],vecr[ser]); pb.Position:=pb.Position+1; end; end; end; lmikle: пользуем правильные теги!!! Понимаю что чужой код смотреть ни кому не горит желанием. Но буду рад любой помощи или совету. Заранее спасибо Спасибо Imikle за правку и совет. Последний раз редактировалось pazitiff, 22.01.2010 в 10:23. |
#2
|
|||
|
|||
![]() Ну, в этом коде я криминала не вижу.
Попробуй для чистоты эксперимента в конце процедуры обнулить массивы через SteLength(array,0,0). Вообще, такая ошибка характерна для ситуации, когда компонент пытается удалить уже удаленный объект. Посмотри, может ты где-то удаляешь какой-либо объект, созданный "руками" и с присвоенными Parent и/или Owner. |
#3
|
||||
|
||||
![]() Я бы на твоем месте поставил бряк (break) для начала на любую строчку в процедуре, если ошибка есть и бряк не сработал, то передвитуть выше, если сработал, то трассировать его клавишей F7 пока не увидишь ошибку...Посмотри в какой строчке ошибка, это наведет на мысли...
PS это может быть долго если используется долгий цикл типа for i := 0 to 1000...но его же можно обойти... В начале был Бит, потом Байт и только потом появилось Слово... |
#4
|
|||
|
|||
![]() Обнуление массивов не помогло, а вот break точнее я пользовался goto мне подсказал что ошибка возникает после выполнения вот этих двух циклов:
Здесь ошибки не будет Код:
for k:=0 to si-1 do begin for l:=0 to si-1 do begin q:=q+1; vecr[q]:=br[k,l]; end; goto label1; end; Код:
for k:=0 to si-1 do begin for l:=0 to si-1 do begin q:=q+1; vecr[q]:=br[k,l]; end; end; goto label1; но почему я понять не могу ![]() |
#5
|
||||
|
||||
![]() помняй
Код:
vecr[q]:=br[k,l]; q:=q+1; |
#6
|
||||
|
||||
![]() использование goto в делфи считается нехорошим тоном (пережитки паскаля), и практикуется лишь в крайних случаях...
видимо у тебя что то в размерности массивов Код:
vecr[q]:=br[k,l]; В начале был Бит, потом Байт и только потом появилось Слово... |
#7
|
|||
|
|||
![]() Спасибо. всем проблема решена. Она была и вправду в размерности массивов. Еще дальше такая же проблема была в сортировке пузырьком. P.S. насчет goto знаю но мне удобно было
![]() |