![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Наследование и виртуальные функции [D5]
nastya © (2005-09-22 15:15:00)Привет! Киньте, пожалуйста, идею, где и как поискать ошибку. Я иссякла:(
Есть два класса TAnyDevice и его наследник TThisDevice. Общие функции TAnyDevice , конкретика у TThisDevice.
Есть две задачи прочитать и записать серийный номер. Чтение происходит нормально, а при записи Acsess Violation. На мой взгляд объявления и порядок выполнения для чтения и записи аналогичен. Но почему тогда ошибка только при записи??!! Вот объявления:
TAnyDevice
//запись данных в память
function WriteDataToEEprom(Addr:integer; Data:PByteArray;DataLen:word):boolean;
//чтение данных из памяти
function ReadDataFromEEprom(Addr:integer; var PData:PByteArray;DataLen:word):boolean;
//запись серийн. ном. в устройство открывая/закр. сеанс связи
function WriteSerialNumberOpenClose:boolean;virtual;
//чтение серийн. ном. из устройства открывая/закр. сеанс связи
function ReadSerialNumberOpenClose:boolean;virtual;
function WriteSerialNumber:boolean;virtual;
function ReadSerialNumber:boolean; virtual;
//чтение одного байта
function ReadByteFromEEprom(Addr:integer;var b:byte):boolean;virtual;abstract;
//запись одного байта
function WriteByteToEEprom(Addr:integer; b:byte):boolean;virtual;abstract;
TThisDevice
function ReadSerialNumber:boolean; override;
function WriteSerialNumber:boolean;override;
function ReadByteFromEEprom(Addr:integer;var b:byte):boolean;override;
function WriteByteToEEprom(Addr:integer; b:byte):boolean;override;
Порядок выолнения чтения
TAnyDevice .ReadSerialNumberOpenClose
TThisDevice.ReadSerialNumber
TAnyDevice .ReadDataFromEEprom
TThisDevice.ReadByteFromEEprom
Запись
TAnyDevice .WriteSerialNumberOpenClose
TThisDevice.WriteSerialNumber
TAnyDevice.WriteDataFromEEprom
TThisDevice.WriteByteFromEEprom <<--!!!! здесь баг
в теле TAnyDevice.WriteDataFromEEprom при попытке вызвать
WriteDataFromEEprom Access Violation.
Digitman (2005-09-22 17:47:00) [1]
> nastya (22.09.05 17:35) [38]
> он иногда гл
врешь ведь)
НЕпонимание тобой работы дебагера в конкретныхситуациях НЕ означает его "глючность" в принципе.
nastya (2005-09-22 17:35:00) [2]Только он иногда глючит. Реально с этим сталкивалась. Поэтому, вместо того, чтобы еще раз просмтотреть, начинаю копать глубже.
Digitman (2005-09-22 17:32:00) [3]
> nastya (22.09.05 17:26) [34]
согласиь, все же встр.отладчик - могучая штука ?
и СВОБОДНОЕ ПРАКТИЧЕСКОЕ владение им (и многими основными его фичами) намного ускоряет ход отладки ?)
nastya (2005-09-22 17:32:00) [4]Так я все и сделала .... вроде бы
Ладно, в следующий раз буду внимательнее. Спасибо
Digitman (2005-09-22 17:29:00) [5]понимаю)
но они действительно элементарные !
и мной изначально таки подразумевалось, что уж здесь-то дилетантского прокола с Вашей стороны как бы и не подразумевается)
nastya (2005-09-22 17:26:00) [6]Не, злость была на Вас, что типа я такая недогадливая и элементарных вещей не сделала :)))
Digitman (2005-09-22 17:24:00) [7]
> nastya (22.09.05 17:20) [32]
> со злости глянула
вот видишь !)
иной раз злость (на самою себя или на свою недогадливость) - весьма полезное состояние души !
)
nastya (2005-09-22 17:20:00) [8][31] Вот! Спасибо! Разумеется смотрела раньше, но сейчас со злости глянула внимательнее. И нашла :))
Digitman (2005-09-22 17:12:00) [9]ПЕРВОЕ, что тебе д.было прийти в голову - это средствами Evaluate/Modify просмотреть, а что же все-таки ФАКТИЧЕСКИ ты пытаешься передать параметрами aи PData[b]
Digitman (2005-09-22 17:10:00) [10]тогда поехали разбираться с фактическими параметрами ... что, как, где объявлено, как инициализировано и т.д. и т.п. ..
nastya (2005-09-22 17:07:00) [11][28]
result:=result and WriteByteToEEprom(a,PData[b]);
При нажатии F7 для выполнения ЭТОЙ строки выдается Access Violation.
Не успевает зайти ВНУТРЬ тела.
Digitman (2005-09-22 17:05:00) [12]кто "оно" ? конкретно ?
WriteByteToEEprom у тебя - НЕ атомарная ф-ция !
она имеет ТВОЮ СОБСТВЕННУЮ реализацию !
состоящую из собственноручно тобой написанных операторов !
так вот я и спрашиваю - на КАКОМ из операторов, находящихся в теле реализованного тобой метода TThisDevice.WriteByteToEEprom, происходит сабж ?!
nastya (2005-09-22 17:02:00) [13][26]
Оно накрывается при ПОПЫТКЕ вызова WriteByteToEEprom ! Разумеется я бы просмотрела.
Digitman (2005-09-22 16:58:00) [14]
> nastya (22.09.05 16:49) [25]
ну а ПОШАГОВО-то пройти тело вызываемого при этом мсетода TThisDevice.WriteByteToEEprom в голову разве не пришло ?!
кто ж тебя заставляет на этой строчке жмакать именно F8 ?
жмакай F7 - и поехали !
шаг за шагом в теле того самого метода, который является перекрытием абстрактного метода TAnyDevice.WriteByteToEEprom ..
> Access violation at adress 00481F13 in module.
меню Search -> Find Error...
вводишь там 00481F13 - дебагер покажет тебе строчку в твоем проекте, где данная проблема имеет тебя)
nastya (2005-09-22 16:49:00) [15][24]
так в этом месте все и накрывается, я же писала[18]
result:=result and WriteByteToEEprom(a,PData[b]);
Digitman (2005-09-22 16:41:00) [16]
> как найти место реальной ошибки
трасс ируя пошагово код своей программы ... где F7 жмакнешь, а где F8 - по ситуации ... главное - ЛОКАЛИЗОВАТЬ "атомарный" вызов, т.е. тот вызов , происходящее в теле которого уже вне сферы твоей компетенции, например, вызов WinAPI-ф-ции
umbra (2005-09-22 16:37:00) [17]
> А как найти место реальной ошибки...
> function WriteByteToEEprom(Addr:integer; b:byte):boolean; virtual; abstract;
>
nastya (2005-09-22 16:34:00) [18][21]
Понятно, что проблема с памятью где-то не здесь. Здесь только результат. А как найти место реальной ошибки...
Digitman (2005-09-22 16:31:00) [19]
> nastya (22.09.05 16:29) [20]
> КАК хотя-бы ее искать?
именно ТАК и искать !
отправной точкой является локализованная тобой (в ходе пошаговой трассировки) трочка твоего кода, при выполнении которой возникает проблемная ситуация.
ты эту строчку локализовала ?
нет.
вот этим и займись !
nastya (2005-09-22 16:29:00) [20]Я даже не прошу, мне помогать реально найти ошибку, но КАК хотя-бы ее искать??