Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Наследование и виртуальные функции [D5]


Страницы:   1 2

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]

Я даже не прошу, мне помогать реально найти ошибку, но КАК хотя-бы ее искать??


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо