![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
посоветуйте как решить проблему [D7, Win2k]
Dysan © (2005-08-17 13:56:00)Проблема следующая.
Пишу одну серьезную прогу по математическим расчетам и т.п.
Она использует добольно большое количество динамических массивов с довольно приличным наполнением.
И при запуске программы периодически возникаю ошибки в разных местах программы на совершенно безобидных строчках, которые раньше без проблем работали. Или возникают ошибки в памяти и программа просто вылетает. Или возникает ошибка в borlandmm.dll
А если запустить программу пройтись по все программе по всем строчкам кода дебагом то никаких ошибок не возникает, все работает как часы! Модуль ShareMem подключен.
Всё это вероятно из-за безолаберной работы с динамическими массивами. Но может быть я не прав.
Например:
mas: array of variant;
SetLength(mas,10);
Я так пологаю что когда массив больше не понадобиться то он автоматически будет отчищен.
А может быть есть способ ручного удаления?
Не мог бы кто нибуть эту проблему как нибуть прокоментировать или посоветовать что нибуть?
Вжжжик (2005-08-22 12:29:00) [1]многопоточность + работа с динамическими массивами предполагают синхронизацию. вообще все зависит от того как реализованы потоки, как реализовано их запуск и завершение. а если в потоке ещё и вызываются методы VCL то ошибка однозначно в этом.
Defunct (2005-08-20 16:55:00) [2]begin...end © (20.08.05 15:49) [18]
Да! в том посте много чего сказано. см [12] это не нарочно. ;>
begin...end (2005-08-20 15:49:00) [3]> Defunct © (19.08.05 00:22) [11]
> Если используется GetMem, проверить чтобы соответствующий FreeMem с таким же значением объема.
Сильно сказано!
Defunct (2005-08-19 18:55:00) [4]Dysan © (19.08.05 12:32) [14]
Если ты не прислушиваешься к советам, тогда зачем зашел сюда?
Поплакаться?
> весь проект это несколько тысяч строк а ошибки большей части возникают не на строчках а где-то в памяти
Где-то выходишь за границы массива, перетираешь какие-то переменные, что впоследствии приводит к сбоям на безобидных участках кода.
> Насчет - перетираю какую нибуть переменную - ничего я не перетираю.
И как позволь спросить ты узнал, что ничего нигде не перетираешь в проекте, состоящем из нескольких тыс. строк?
> Насчет циклов там все впоряде, писал так как и надо.
Пустые слова. Ты не привел ни одного кусочка кода.
Anatoly Podgoretsky (2005-08-19 16:58:00) [5]Dysan © (19.08.05 12:32) [14]
Может.
Ольга (2005-08-19 16:37:00) [6]Если вы используете переменную цикла после выхода из цикла (что само по себе неправильно), то могут происходить подобные глюки, т.к. никто не гарантирует сохранение ее значения.
Предложение [4] пробовали?
Dysan (2005-08-19 12:32:00) [7]Насчет - перетираю какую нибуть переменную - ничего я не перетираю. Не может же код десять раз подрят работать нормально а на одиннацатый сбойнуть или сбойнуть на третий раз или вообще с самого начала или отработать двадцать раз без одного сбоя. И все это при одних и тех же входных данных!
Насчет циклов там все впоряде, писал так как и надо.
А приводить тут код, то чесно говоря не знаю что тут приводить потому что весь проект это несколько тысяч строк а ошибки большей части возникают не на строчках а где-то в памяти т.е. просто ошибка без останова на какой-либо строчке кода, что то вроде EAccessViolation по такому то адресу.
В общем я не знаю что еще предпринять :(
Leonid Troyanovsky (2005-08-19 08:40:00) [8]
> Dysan © (18.08.05 18:08) [9]
> правда я вычисления делаю в отдельном от программе потоке!
> может быть из-за этого?
IsMultithread = True?
--
Regards, LVT.
Defunct (2005-08-19 00:25:00) [9]> Где-то выходишь за граница массива, перетираешь какие-то переменную
Хахаха!!
сори, это у меня такая серия опечаток не специально вышла
Defunct (2005-08-19 00:22:00) [10]Dysan © (18.08.05 18:08) [9]
Может и из-за этого.
Dysan © (18.08.05 21:46) [10]
потому что ошибка в 17-й строке.
Где-то выходишь за граница массива, перетираешь какие-то переменную, что впоследствии приводит к сбоям на безобидных участках кода.
1. Включить Range-checking
2. Заменить во всех циклах
for i := Low(<имя массива> ) to High(<имя массива>) do
3. Если используется GetMem, проверить чтобы соответствующий FreeMem с таким же значением объема.
Ну и 4:
Приведика чуток реального кода, а не просто пример
SetLength(mas, 10).
Dysan (2005-08-18 21:46:00) [11]Так никто не подскажет почему в работающем коде глюки возникают с памятью?
Dysan (2005-08-18 18:08:00) [12]правда я вычисления делаю в отдельном от программе потоке! может быть из-за этого?
Dysan (2005-08-18 18:06:00) [13]Да sharemem я действительно использовал раньше когда обращался к dll Забыл убрать.
И всё таки странно. я вроде сделал все возможное. удаляю все массивы но при их повторном использовании (программа в цикле несколько раз обрабатывает данные) на каком-нибуть очередном повторении происходят ошибки в памяти. И никак от них не получаеться избавиться :(
Defunct (2005-08-18 16:02:00) [14]Dysan © (18.08.05 15:38) [6]
Вот AP и спрашивает зачем используешь DLL, для которой потребовался ShareMem. Просто выброси ShareMem вместе с той DLL для которой он используется.
Dysan (2005-08-18 15:38:00) [15]вмсысле зачем я использую dll ? а как иначе ShareMem без borland.dll использовать?
Anatoly Podgoretsky (2005-08-17 21:26:00) [16]Зачем исплдщуешь ДЛЛ, чтобы получить проблемы?
Ольга (2005-08-17 16:34:00) [17]Отключите оптимизацию в опциях проекта.
Dysan (2005-08-17 14:20:00) [18]каюсь variant я привел для примера
т.е. делать :=nil ! попробую спасибо.
Leonid Troyanovsky (2005-08-17 14:15:00) [19]
> Dysan © (17.08.05 13:56)
> Я так пологаю что когда массив больше не понадобиться то
> он автоматически будет отчищен.
Он может быть очищен, если выйдет из области видимости,
например, локальная переменная после выхода из процедуры.
> А может быть есть способ ручного удаления?
SetLength(mas, 0);
> Не мог бы кто нибуть эту проблему как нибуть прокоментировать
> или посоветовать что нибуть?
Например, не использовать variant.
Или, если пользовать, то, хотя-бы, VarArrayCreate.
--
Regards, LVT.
Vlad Oshin (2005-08-17 14:10:00) [20]
> Я так пологаю что когда массив больше не понадобиться то
> он автоматически будет отчищен.
> А может быть есть способ ручного удаления?
только Вы определяете, когда массив больше не нужен
:=nil;
прочитать
http://dkws.narod.ru/linux/dev/dyn-arr/dyn-arr.html