|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
22.02.2009, 22:59 | #1 |
Пользователь
Регистрация: 17.02.2008
Сообщений: 74
|
Еще раз о EAccessViolation.
Здравствуйте.
Еще раз о EAccessViolation. Поискал по форуму, подобных тем много, но не нашел ответ на свой вопрос. В моей программе несколько динамических массивов. Ошибка выскакивает при закрытии программы. Ошибка возникает только после инициирования любого из массивов, т.е. если открыл и сразу-же закрыл программу, не нажимая другие кнопки - ошибка не появляется. ОШИБКА: Project Project.exe raised exeption class EAccessViolation with message 'Access violation at address 00401B43 in module 'Project.exe'. Read of address 00000000. ПРОЦЕДУРА ЗАКРЫТИЯ: procedure TfmMain.aExitExecute(Sender: TObject); begin Dist:= nil; ZMatrix:= nil; Table:= nil; Klaster:= nil; fmMAin.Close; end; Подскажите, пожалуйста, где искать глюк? |
22.02.2009, 23:36 | #2 |
*
Старожил
Регистрация: 22.11.2006
Сообщений: 9,201
|
Ставим брэкпойнт на строку
Dist:= nil; Дальше идем по шагам (F8) и смотрим, где программа "спотыкается". "Read of address 00000000" как правило, однозначно указывает на обращение к несуществующему объекту (переменной). Подозреваю, что вы не все их создаете, зато все "чохом" (т.е. не думая) пытаетесь "занилить"... Либо какая-то из пар связана "родственными" отношениями и, как минимум одна из строк является лишней. Последний раз редактировалось mihali4; 22.02.2009 в 23:38. |
23.02.2009, 00:01 | #3 |
Пользователь
Регистрация: 17.02.2008
Сообщений: 74
|
Переписал код:
procedure TfmMain.aExitExecute(Sender: TObject); begin If Klaster <> nil Then Klaster:= nil; If Table <> nil Then Table:= nil; If ZMatrix <> nil Then ZMatrix:= nil; If Dist <> nil Then Dist:= nil; fmMAin.Close; end; Все равно ошибка. |
23.02.2009, 00:30 | #4 |
Форумчанин
Регистрация: 06.06.2007
Сообщений: 282
|
Andre1723, Было бы неплохо весь код просмотреть. Тогда можно точно сказать в чем проблема.
Не важно, как часто вы падаете. Важно, как часто вы поднимаетесь. Винс Ломбарди.
|
23.02.2009, 00:44 | #5 |
Пользователь
Регистрация: 17.02.2008
Сообщений: 74
|
Еще раз о EAccessViolation
У меня в программе еще пара локальных массивов. Похоже придется их обнулять по мере НЕнадобности.
Процедура "Readsp" в отдельном модуле. В ней просто данные "RECORD" перегоняются в "ARRAY". Последний раз редактировалось Andre1723; 23.02.2009 в 00:47. Причина: ошибки |
23.02.2009, 01:07 | #6 |
Форумчанин
Регистрация: 06.06.2007
Сообщений: 282
|
Возможно проблема в индексации. В статичсеких массивах вы указываете диапазон, начиная с 1. В динамических индексация начинается с 0.
Например здесь: Код:
Не важно, как часто вы падаете. Важно, как часто вы поднимаетесь. Винс Ломбарди.
Последний раз редактировалось VVM; 23.02.2009 в 01:10. |
23.02.2009, 01:20 | #7 |
Пользователь
Регистрация: 17.02.2008
Сообщений: 74
|
Я пытался задавать массивы с запасом (+1). Видимо не все проследил.
Просто нумерация с "1" удобна. (запись №1, ит.д.). Спасибо всем. Буду переделывать с "0" . Последний раз редактировалось Andre1723; 23.02.2009 в 01:23. Причина: P.S. |
23.02.2009, 01:23 | #8 |
Форумчанин
Регистрация: 06.06.2007
Сообщений: 282
|
Возможно, где-то идет обращение к элементу дин. массива, размерность которого еще не задана.
Не важно, как часто вы падаете. Важно, как часто вы поднимаетесь. Винс Ломбарди.
|
23.02.2009, 01:26 | #9 |
Форумчанин
Регистрация: 16.12.2006
Сообщений: 859
|
Или к последнему элементу дин массива по нумерации.
например, ar[length(ar)] вызовет эту ошибку. в любом случае. |
23.02.2009, 01:27 | #10 |
Пользователь
Регистрация: 17.02.2008
Сообщений: 74
|
...или задана в процедуре для локальной переменной-масиву??? А в другой процедуре такая переменная будет доступна?
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Еще раз крестики - нолики. | Иваненко | Помощь студентам | 2 | 17.12.2007 20:09 |