Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
1-1126074951
V-A-V
2005-09-07 10:35
2005.10.02
Как отловить запуск и завершение.


1-1126515311
Sergey85
2005-09-12 12:55
2005.10.02
Мне нужно из текставого файла формата txt вытащить в Delphi


6-1117769707
Gamer
2005-06-03 07:35
2005.10.02
SendBuf vs ALL


1-1126346249
kblc
2005-09-10 13:57
2005.10.02
Методы com


1-1126686308
SuperAlexey
2005-09-14 12:25
2005.10.02
runtime компоненты