Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2010, 12:27   #1
HollyPaladin
Пользователь
 
Аватар для HollyPaladin
 
Регистрация: 29.11.2009
Сообщений: 51
По умолчанию EAcess violation

Я написал функцию конвертирующую файлы из одного формата в другой.
Сначала функция работала без ошибок.Потом я запустил на конвертацию файл большого размера, функция так же сработала без ошибок.Однако
если не выходить из программы а повторного запустить функцию выскакивает ошибка EAcess violation.После того как я нажал OK программа зависла,а место возникновения ошибки в коде не было показано.Как в таком случае можно определить где возникла ошибка и исправить ее.
Пишу на C++ Builder 6.0.
HollyPaladin вне форума Ответить с цитированием
Старый 31.05.2010, 12:35   #2
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Скорее всего во время открытия одного из файлов, может после выполнения функции ты забываешь его закрыть? Может быть во время попытки чтения из исходного файла или записи в целевой файл. В общем надо разбираться
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 31.05.2010, 12:37   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,069
По умолчанию

Ставим точку останова на первой строке функции (слева от кода есть такая вертикальная серая полоса толщиной примерно в сантиметр, на неё мышой жмякаем, должен красный кружок напротив соответствующей строки появиться) и пошагово смотрим как всё выполняется. Так можно определить на какой именно строке вылетает исключение. Так же можно определить значения переменных.
Access Violation, как правило, вылетает из-за неправильной работы с указателями и всплывает ошибка не на проблемной строке, а после неё. Так что корень зла пошаговой отладкой не найти. Можно только узнать последствия и по ним выявить виновника.
pu4koff вне форума Ответить с цитированием
Старый 31.05.2010, 12:41   #4
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Цитата:
Ставим точку останова на первой строке функции (слева от кода есть такая вертикальная серая полоса толщиной примерно в сантиметр, на неё мышой жмякаем, должен красный кружок напротив соответствующей строки появиться) и пошагово смотрим как всё выполняется.
В С++ Builder это же можно сделать нажатием клавиши F5, пошаговая компиляция F8, но я подозреваю, что ТС это знает
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 31.05.2010, 12:45   #5
HollyPaladin
Пользователь
 
Аватар для HollyPaladin
 
Регистрация: 29.11.2009
Сообщений: 51
По умолчанию

mrChester,все открываемые файлы закрываются в конце функции,вся выделяемая память освобождается.
pu4koff,этот файл конвертируется 10 минут, если по шагам выполнять очень много времени займет.
HollyPaladin вне форума Ответить с цитированием
Старый 31.05.2010, 12:55   #6
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Ошибка появляется при повторном выполнении, значит один раз прогони конвертацию, а потом при повторном выполнении функции уже приостанови, пошагово не нужно делать все, конвертация у тебя проходит в цикле, поэтому сам цикл нет надобности рассматривать пошагово, поставишь еще одну метку (F5) сразу после цикла после цикла и посмотришь как ведет себя программа при закрытии.
ЗЫ. Может лучше код покажешь?
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 03.06.2010, 14:53   #7
HollyPaladin
Пользователь
 
Аватар для HollyPaladin
 
Регистрация: 29.11.2009
Сообщений: 51
По умолчанию

mrChester,попробовал сделать как ты написал это заняло 8 часов и почти не дало результатов, я сделал по-другому: создал новый проект добавил все классы и функции в один файл(изначально у меня было 2 файла один для формы другой для классов и функций конвертации) и в результате после ошибки в коде начало показывать место ее возникновения.
Ошибка возникает во время выделения памяти оператором new для объекта.
Ошибка такая:
Project Project1.exe raised exception class EAccessViolation with message
"Access violation at address 01193E3B in module 'BORLNDMM.DLL'.Write of address 0E93BF1C.

Последний раз редактировалось HollyPaladin; 04.06.2010 в 12:41. Причина: хочу убать код так-как сам уже разобрался
HollyPaladin вне форума Ответить с цитированием
Старый 04.06.2010, 12:39   #8
HollyPaladin
Пользователь
 
Аватар для HollyPaladin
 
Регистрация: 29.11.2009
Сообщений: 51
По умолчанию

Все исправил ошибку.
Только теперь возникла новая.
Эту функцию нужно поместить в dll и вызывать ее оттуда.Я поместил ее в
dll,написал програму загружающую функцию из длл.Если запускать эту программу из билдера то все работает без ошибок, а если запустить экзешник из папки с проектом то программа зависает в начале работы, на форме пишет not responsing.
Из-за чего может зависать программа и как это исправить?
HollyPaladin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка Access Violation AHTuKiLLeR Общие вопросы Delphi 8 02.06.2009 10:48
violation of FOREIGN KEY KiSH333 БД в Delphi 1 17.02.2009 16:05
Access Violation SunKnight Общие вопросы Delphi 2 05.06.2008 16:46
Access Violation Carbon Общие вопросы Delphi 12 18.09.2007 19:55