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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2009, 22:59   #1
Andre1723
Пользователь
 
Аватар для Andre1723
 
Регистрация: 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;
Подскажите, пожалуйста, где искать глюк?
Andre1723 вне форума Ответить с цитированием
Старый 22.02.2009, 23:36   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Ставим брэкпойнт на строку
Dist:= nil;
Дальше идем по шагам (F8) и смотрим, где программа "спотыкается".
"Read of address 00000000" как правило, однозначно указывает на обращение к несуществующему объекту (переменной).
Подозреваю, что вы не все их создаете, зато все "чохом" (т.е. не думая) пытаетесь "занилить"... Либо какая-то из пар связана "родственными" отношениями и, как минимум одна из строк является лишней.

Последний раз редактировалось mihali4; 22.02.2009 в 23:38.
mihali4 вне форума Ответить с цитированием
Старый 23.02.2009, 00:01   #3
Andre1723
Пользователь
 
Аватар для Andre1723
 
Регистрация: 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;

Все равно ошибка.
Andre1723 вне форума Ответить с цитированием
Старый 23.02.2009, 00:30   #4
VVM
Форумчанин
 
Аватар для VVM
 
Регистрация: 06.06.2007
Сообщений: 282
По умолчанию

Andre1723, Было бы неплохо весь код просмотреть. Тогда можно точно сказать в чем проблема.
Не важно, как часто вы падаете. Важно, как часто вы поднимаетесь. Винс Ломбарди.
VVM вне форума Ответить с цитированием
Старый 23.02.2009, 00:44   #5
Andre1723
Пользователь
 
Аватар для Andre1723
 
Регистрация: 17.02.2008
Сообщений: 74
По умолчанию Еще раз о EAccessViolation

У меня в программе еще пара локальных массивов. Похоже придется их обнулять по мере НЕнадобности.
Процедура "Readsp" в отдельном модуле. В ней просто данные "RECORD" перегоняются в "ARRAY".
Вложения
Тип файла: txt код.txt (10.4 Кб, 116 просмотров)

Последний раз редактировалось Andre1723; 23.02.2009 в 00:47. Причина: ошибки
Andre1723 вне форума Ответить с цитированием
Старый 23.02.2009, 01:07   #6
VVM
Форумчанин
 
Аватар для VVM
 
Регистрация: 06.06.2007
Сообщений: 282
По умолчанию

Возможно проблема в индексации. В статичсеких массивах вы указываете диапазон, начиная с 1. В динамических индексация начинается с 0.
Например здесь:
Код:
For i:=1 To 3 Do
    begin
      For j:=1 To kolpr Do
        begin
          xsr[i]:= xsr[i] + table[j,i];
А массив table, по идее, следует заполнять с [0, 0]. Но это само по себе не страшно. Страшно то, что это смещение вылезет "с другой стоороны", то есть произойдет обращение к несуществующему элементу массива.
Не важно, как часто вы падаете. Важно, как часто вы поднимаетесь. Винс Ломбарди.

Последний раз редактировалось VVM; 23.02.2009 в 01:10.
VVM вне форума Ответить с цитированием
Старый 23.02.2009, 01:20   #7
Andre1723
Пользователь
 
Аватар для Andre1723
 
Регистрация: 17.02.2008
Сообщений: 74
По умолчанию

Я пытался задавать массивы с запасом (+1). Видимо не все проследил.
Просто нумерация с "1" удобна. (запись №1, ит.д.).

Спасибо всем. Буду переделывать с "0" .

Последний раз редактировалось Andre1723; 23.02.2009 в 01:23. Причина: P.S.
Andre1723 вне форума Ответить с цитированием
Старый 23.02.2009, 01:23   #8
VVM
Форумчанин
 
Аватар для VVM
 
Регистрация: 06.06.2007
Сообщений: 282
По умолчанию

Возможно, где-то идет обращение к элементу дин. массива, размерность которого еще не задана.
Не важно, как часто вы падаете. Важно, как часто вы поднимаетесь. Винс Ломбарди.
VVM вне форума Ответить с цитированием
Старый 23.02.2009, 01:26   #9
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

Или к последнему элементу дин массива по нумерации.
например, ar[length(ar)] вызовет эту ошибку. в любом случае.
Роман Радер вне форума Ответить с цитированием
Старый 23.02.2009, 01:27   #10
Andre1723
Пользователь
 
Аватар для Andre1723
 
Регистрация: 17.02.2008
Сообщений: 74
По умолчанию

...или задана в процедуре для локальной переменной-масиву??? А в другой процедуре такая переменная будет доступна?
Andre1723 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Еще раз крестики - нолики. Иваненко Помощь студентам 2 17.12.2007 20:09