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