Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.53/36: Рейтинг темы: голосов - 36, средняя оценка - 4.53
kos9450
0 / 0 / 0
Регистрация: 09.02.2011
Сообщений: 5
1

EAccessViolation ошибка...

09.02.2011, 13:53. Просмотров 7461. Ответов 9
Метки нет (Все метки)

Добрый день. Я уже третий месяц пытаюсь сделать проект "датчик движения", но время от времени, в процессе отладки, выскакивает ошибка 'Access violation at address 0046F181 in module 'Home_Guard.exe'. Read of address 021852F7'. Привожу проблемный кусок кода:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
k:extended;
i,j:integer;
begin
 
image2.Picture.Bitmap.Assign(image1.Picture.Bitmap);
SampleGrabber.GetBitmap(image1.Picture.Bitmap); if image2.Picture.Bitmap.Empty then exit;
k := 0;
for i := 0 to image1.Picture.Bitmap.Height - 1 do begin
  p1 := prgbarray(image1.Picture.Bitmap.ScanLine[i]);  p2 := prgbarray(image2.Picture.Bitmap.ScanLine[i]);
  for j := 0 to image1.Picture.Bitmap.Width - 1 do begin
    if (p1[j].rgbtBlue = p2[j].rgbtBlue)and(p1[j].rgbtGreen=p2[j].rgbtGreen)and(p1[j].rgbtRed=p2[j].rgbtRed) //Вот на этой строке возникает ошибка 
then continue;
     if (p1[j].rgbtBlue <> p2[j].rgbtBlue)or(p1[j].rgbtGreen<>p2[j].rgbtGreen)or(p1[j].rgbtRed<>p2[j].rgbtRed) then
      k:=k+1;
   end;
  end;
Переменные p1 и p2 типа pRGBArray:
Delphi
1
2
3
4
5
6
const
  PixelCountMax = 32768;
 
type
  pRGBArray = ^TRGBArray;
  TRGBArray =array[0..PixelCountMax-1] of TRGBTriple;
Пробовал использовать переменные типа pbytearray, но проблема оставалась.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2011, 13:53
Ответы с готовыми решениями:

EAccessViolation ошибка
EAccessViolation ошибка при нажатии на кнопку, в коде при сложении.... procedure...

Ошибка: EAccessViolation
допустил ошибку, понятия не имею, в чем она заключается....(отмечена в коде) EAccessViolation ...

Ошибка Eaccessviolation
library Data_Units; Uses Windows, Messages, SysUtils, Variants, Classes, Graphics,...

Ошибка: class EAccessViolation with message
При запуске выдаёт ошибкуProject Project1.exe raised exception class EAccessViolation with message...

Массив классов, ошибка EAccessViolation
Суть такова. Есть класс, описывающий учебные дисциплины. type TSubject = class(TObject) ...

9
Mawrat
12878 / 5780 / 1704
Регистрация: 19.09.2009
Сообщений: 8,807
09.02.2011, 15:58 2
Попробуй вести журнал ошибок.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
try
  //Проблемный код.
  //...
except
  on e : Exception do begin
    Memo1.Lines.Add('Ошибка: ' + e.Message);
    Memo1.Lines.Add('i = ' + IntToStr(i) + ', j = ' + IntToStr(j));
    Memo1.Lines.Add('image1.Picture.Bitmap.Height = ' + IntToStr(image1.Picture.Bitmap.Height));
    Memo1.Lines.Add('image1.Picture.Bitmap.Width = ' + IntToStr(image1.Picture.Bitmap.Width));
    //...
    Raise;
  end;
end;
1
kos9450
0 / 0 / 0
Регистрация: 09.02.2011
Сообщений: 5
09.02.2011, 16:16  [ТС] 3
Благодарю, выловил ошибку, но здесь мало полезной инфы... Счетчики не уползают за пределы битмапа...

Ошибка: Access violation at address 0046F17A in module 'Home_Guard.exe'. Read of address 015436D8
i = 370, j = 456
image1.Picture.Bitmap.Height = 480
image1.Picture.Bitmap.Width = 640
Ошибка: Access violation at address 0046F186 in module 'Home_Guard.exe'. Read of address 021A3101
i = 97, j = 0
image1.Picture.Bitmap.Height = 480
image1.Picture.Bitmap.Width = 640
0
Mawrat
12878 / 5780 / 1704
Регистрация: 19.09.2009
Сообщений: 8,807
09.02.2011, 17:21 4
Ещё может быть проблема вот где. Элементами массивов, на которые указывают P1 и P2 являются экземпляры (объекты) класса TRGBTriple. Т. е., каждый элемент массива P1^[i], P1^[j] и P2^[i], P2^[j] должен быть создан через конструктор: P1^[Ind] := TRGBTriple.Create(...). Это действие должно выполняться в prgbarray(). Если окажется, что по каким-то причинам экземпляр для некоторых индексов массивов не создаётся - тогда при обращении к этим элементам (к методам или свойствам объектов, которые должны быть записаны в эти элементы) возникнет ошибка.
0
09.02.2011, 17:21
kos9450
0 / 0 / 0
Регистрация: 09.02.2011
Сообщений: 5
09.02.2011, 17:57  [ТС] 5
Так получается конструктор нужно организовать циклом всего один раз (например, в обработчике формы OnCreate), или постоянно выполнять его в приведенном мною цикле, до scanline'а?
0
Mawrat
12878 / 5780 / 1704
Регистрация: 19.09.2009
Сообщений: 8,807
09.02.2011, 20:45 6
Я не знаю какая архитектура у алгоритма. Конструкторы следует вызвать, по крайней мере, каждый раз, когда создаётся массив, указатель на который возвращает функция prgbarray().
Кроме этого надо не забывать уничтожать ранее созданные объекты. Например, если у нас уже есть массив P1^, и для каждого его элемента был вызван конструктор. Если теперь мы решили заполнить этот массив заново путём повторного вызова конструкторов, то перед этим следует не забыть выполнить деструкторы для всех ранее созданных элементов. Иначе произойдёт утечка памяти. Т. к., прежние объекты, если их не уничтожить, так и останутся в памяти.
1
kos9450
0 / 0 / 0
Регистрация: 09.02.2011
Сообщений: 5
16.02.2011, 19:04  [ТС] 7
Большое Вам спасибо, буду экспериментировать).
0
CodeMonkey
47 / 47 / 2
Регистрация: 21.01.2011
Сообщений: 151
16.02.2011, 21:28 8
Многопоточность юзаешь?
0
kos9450
0 / 0 / 0
Регистрация: 09.02.2011
Сообщений: 5
16.02.2011, 21:31  [ТС] 9
Да если б знал, как... Я дельфи, в основном, поверхностно знаю, на более глубокое изучение нет времени.
0
CodeMonkey
47 / 47 / 2
Регистрация: 21.01.2011
Сообщений: 151
16.02.2011, 21:41 10
Тогда проверь что image1.Picture.Bitmap.Width/Height = image2.Picture.Bitmap.Width/Height.

Как-то так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
image2.Picture.Bitmap.Assign(image1.Picture.Bitmap);
SampleGrabber.GetBitmap(image1.Picture.Bitmap); if image2.Picture.Bitmap.Empty then exit;
k := 0;
 
Assert(Assigned(image1));
Assert(Assigned(image2));
Assert(Assigned(image1.Picture));
Assert(Assigned(image2.Picture));
Assert(Assigned(image1.Picture.Bitmap));
Assert(Assigned(image2.Picture.Bitmap));
Assert(Assigned(image1.Picture.Bitmap.Width = image2.Picture.Bitmap.Width));
Assert(Assigned(image1.Picture.Bitmap.Height = image2.Picture.Bitmap.Height));
 
for i := 0 to image1.Picture.Bitmap.Height - 1 do 
begin
  p1 := prgbarray(image1.Picture.Bitmap.ScanLine[i]);  
  p2 := prgbarray(image2.Picture.Bitmap.ScanLine[i]);
 
  Assert(Assigned(p1));
  Assert(Assigned(p2));
 
  for j := 0 to image1.Picture.Bitmap.Width - 1 do 
  begin
    if (p1[j].rgbtBlue  = p2[j].rgbtBlue) and
       (p1[j].rgbtGreen = p2[j].rgbtGreen) and
       (p1[j].rgbtRed   = p2[j].rgbtRed) then
      continue;
 
    if (p1[j].rgbtBlue  <> p2[j].rgbtBlue) or
       (p1[j].rgbtGreen <> p2[j].rgbtGreen) or
       (p1[j].rgbtRed   <> p2[j].rgbtRed) then
      k:=k+1;
   end;
  end;
Добавлено через 1 минуту
P.S. Кстати, проверка с <> - излишняя.
0
16.02.2011, 21:41
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.02.2011, 21:41

Ошибка EAccessViolation. Что делать?
Приветствую всех! Как можно разрешить странную ошибку eaccessviolation? Дело в том, что я пока...

Ошибка: Exception EAccessViolation in module
Добрый день! Люди, помогите, пожалуйста! Ошибка при запуске программы: Exception EAccessViolation...

Ошибка EAccessViolation в своей процедуре
Есть массив объявленный глобально, в обычных процедурах с ним можно делать что угодно... Когда...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.