![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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;но почему я понять не могу В двух словах о коде в массив 3х3 ранее записывается яркость каждого пикселя, в этих циклах представленных выше, я переписываю в вектор для упорядочивания по возрастанию методом пузырька. Закоментировал эти циклы, все без ошибки но свою функцию программа понятное дело не выполняет |
|
#5
|
||||
|
||||
|
помняй
Код:
vecr[q]:=br[k,l];
q:=q+1; |
|
#6
|
||||
|
||||
|
использование goto в делфи считается нехорошим тоном (пережитки паскаля), и практикуется лишь в крайних случаях...
видимо у тебя что то в размерности массивов Код:
vecr[q]:=br[k,l]; |
|
#7
|
|||
|
|||
|
Спасибо. всем проблема решена. Она была и вправду в размерности массивов. Еще дальше такая же проблема была в сортировке пузырьком. P.S. насчет goto знаю но мне удобно было
![]() |