Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 Динамические массивы [Delphi]
Аватара пользователя
Язык программирования: Delphi. Компилятор Borland 7
Всем прива!!! Дело вот в чем. Откомпилировал программу, синтаксических ошибок не найдено и на выполненние запущен .exe файл. Начало хорошее. Я заполняю необходимые поля ввода. Вспомогаельые расчеты идут хорошо и... тут туфтовая ошибка! Дело дошло до того, что я компилировал программу буквально после каждой строчки и доводил её до успешного завершения. И подкараулил я эту туфтовую ошибку на следующей безобидной вещи - сразу после объявления динамического массива в разделе var : masSpectr : array of real; Дело в том, что в программе уже есть порядка десяти динамических массивов. Может быть есть какой-нибуь лимит на количество динамических массивов? Во всяком случае другого объяснения я не вижу.

 Re: Динамические массивы
Цитата:
тут туфтовая ошибка!

Что именно за ошибка?

P.S.: Приведите фрагменты кода, работающего с проблемным массивом.

 Re: Динамические массивы
Alhimik в сообщении #287206 писал(а):
И подкараулил я эту туфтовую ошибку на следующей безобидной вещи - сразу после объявления динамического массива в разделе var : masSpectr : array of real;

Скорее всего у вас где то память бьется, а эта строчка случайно порождает "неудачное" расположение памяти.

 Re: Динамические массивы
Аватара пользователя
Ошибка:
Project DopplerFrequency.exe raised exception class EAccessViolation with message 'Access violation at address 00404EDB in module 'DopplerFrequency.exe'. Read of address 00000100' Process stopped. Use Step or Run to continue.

И в том то и дело, что с этим массивом я не работаю - я просто его объявил.
Прогрмма у меня довольно большая. Так что не думаю, что у кого-то кроме меня еще может появиться желание расчехлиться в ней.

 Re: Динамические массивы
Alhimik в сообщении #287466 писал(а):
Read of address 00000100

Скорее всего неинициализированный указатель или не созданый объект. Приводите код.

 Re: Динамические массивы
Alhimik в сообщении #287466 писал(а):
И в том то и дело, что с этим массивом я не работаю - я просто его объявил.

Раз объявили его как переменную, значит выделили под нее память, даже если вы с ним не работали то все равно расположение остальных данных в памяти изменилось.

А перехватить этот эксепшин не пробовали?

 Re: Динамические массивы
2Alhimik
Цитата:
Прогрмма у меня довольно большая.

Если массив глобальный, приведите текст модуля, если локальный -- текст процедуры\функции. В чем проблема? А то игра в ясновидение получается. :)

 Re: Динамические массивы
Стесняюсь спросить: а что, в отладчике нельзя пройти и посмотреть, где падает?

 Re: Динамические массивы
Аватара пользователя
Circiter в сообщении #287524 писал(а):
2Alhimik
Цитата:
Прогрмма у меня довольно большая.

Если массив глобальный, приведите текст модуля, если локальный -- текст процедуры\функции. В чем проблема? А то игра в ясновидение получается. :)


Массив глобальный. В программе 12 форм (модулей 14 - два из них писал сам). Кому интерестно - могу скинуть на e-mail. Выкладывать этот здоровый текст программы тут - по прежнему не вижу смыла, да и модераторы мне этого не простят. Да и к тому же проблема, вроде как решилась. Есть такой файл var.txt , где объявлены все глобальные переменные в порядке форм. Если объявлять массив в середние файла - ошибка, я попробовал объявить в конце - и как по маслу. Может причина действительно в распределении памяти.
Кстати да, а как перехватывать экскепшин? Я слышал о существовании какого-то режима отладки, где можно отслеживать чему равна каждая перемення на каждой строке при выполнении. На практике ни разу не применял.

 Re: Динамические массивы
Откройте для себя try, except...

 Re: Динамические массивы
Аватара пользователя
Не мой стиль. Если делишь на что-то, что вводит пользователь - обязательно заранее проверь не ноль ли это.
При работе с динамическими массивам - сначала установить размер массива SetLenght (masDinmicq, N); и нумерация начинается с нуля i= 0..N-1; (самые расспространённые ошибки).
В данном случае, p51x, применение try ... except ничем не поможет. Это почти тоже самое, что место
i:=0;
while i<=N-1 do
begin
...
i:= i+1;
end;

писать for i:=0 to N-1 do ....

 Re: Динамические массивы
Не тоже самое. Пример, динамический массив не создался или его указатель затерся... оба ваши варианты вылетят.

-- Ср фев 17, 2010 17:16:37 --

Без кода можно долго телепать. Основные причины я указал.

 [ Сообщений: 12 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group