0 / 0 / 0
Регистрация: 09.02.2011
Сообщений: 5
|
|||||||||||
1 | |||||||||||
EAccessViolation ошибка...09.02.2011, 13:53. Показов 8939. Ответов 9
Метки нет (Все метки)
Добрый день. Я уже третий месяц пытаюсь сделать проект "датчик движения", но время от времени, в процессе отладки, выскакивает ошибка 'Access violation at address 0046F181 in module 'Home_Guard.exe'. Read of address 021852F7'. Привожу проблемный кусок кода:
0
|
09.02.2011, 13:53 | |
Ответы с готовыми решениями:
9
EAccessViolation ошибка Ошибка: EAccessViolation Ошибка Eaccessviolation Ошибка: class EAccessViolation with message |
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
||||||
09.02.2011, 15:58 | 2 | |||||
Попробуй вести журнал ошибок.
1
|
0 / 0 / 0
Регистрация: 09.02.2011
Сообщений: 5
|
|
09.02.2011, 16:16 [ТС] | 3 |
Благодарю, выловил ошибку, но здесь мало полезной инфы... Счетчики не уползают за пределы битмапа...
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
09.02.2011, 17:21 | 4 |
Ещё может быть проблема вот где. Элементами массивов, на которые указывают P1 и P2 являются экземпляры (объекты) класса TRGBTriple. Т. е., каждый элемент массива P1^[i], P1^[j] и P2^[i], P2^[j] должен быть создан через конструктор: P1^[Ind] := TRGBTriple.Create(...). Это действие должно выполняться в prgbarray(). Если окажется, что по каким-то причинам экземпляр для некоторых индексов массивов не создаётся - тогда при обращении к этим элементам (к методам или свойствам объектов, которые должны быть записаны в эти элементы) возникнет ошибка.
0
|
0 / 0 / 0
Регистрация: 09.02.2011
Сообщений: 5
|
|
09.02.2011, 17:57 [ТС] | 5 |
Так получается конструктор нужно организовать циклом всего один раз (например, в обработчике формы OnCreate), или постоянно выполнять его в приведенном мною цикле, до scanline'а?
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
09.02.2011, 20:45 | 6 |
Я не знаю какая архитектура у алгоритма. Конструкторы следует вызвать, по крайней мере, каждый раз, когда создаётся массив, указатель на который возвращает функция prgbarray().
Кроме этого надо не забывать уничтожать ранее созданные объекты. Например, если у нас уже есть массив P1^, и для каждого его элемента был вызван конструктор. Если теперь мы решили заполнить этот массив заново путём повторного вызова конструкторов, то перед этим следует не забыть выполнить деструкторы для всех ранее созданных элементов. Иначе произойдёт утечка памяти. Т. к., прежние объекты, если их не уничтожить, так и останутся в памяти.
1
|
0 / 0 / 0
Регистрация: 09.02.2011
Сообщений: 5
|
|
16.02.2011, 19:04 [ТС] | 7 |
Большое Вам спасибо, буду экспериментировать).
0
|
47 / 47 / 2
Регистрация: 21.01.2011
Сообщений: 151
|
|
16.02.2011, 21:28 | 8 |
Многопоточность юзаешь?
0
|
0 / 0 / 0
Регистрация: 09.02.2011
Сообщений: 5
|
|
16.02.2011, 21:31 [ТС] | 9 |
Да если б знал, как... Я дельфи, в основном, поверхностно знаю, на более глубокое изучение нет времени.
0
|
47 / 47 / 2
Регистрация: 21.01.2011
Сообщений: 151
|
||||||
16.02.2011, 21:41 | 10 | |||||
Тогда проверь что image1.Picture.Bitmap.Width/Height = image2.Picture.Bitmap.Width/Height.
Как-то так:
P.S. Кстати, проверка с <> - излишняя.
0
|
16.02.2011, 21:41 | |
16.02.2011, 21:41 | |
Помогаю со студенческими работами здесь
10
Массив классов, ошибка EAccessViolation Ошибка EAccessViolation. Что делать? Ошибка: Exception EAccessViolation in module Ошибка EAccessViolation в своей процедуре Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |