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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2008, 21:05   #1
neo_m
 
Регистрация: 05.03.2008
Сообщений: 9
Восклицание Помогите пожалуста в работе с класами

Здраствуйте. Работаю над одной програмой но никак не могу понять в чем случилась проблема. Суть в следующем. Создаю клас, в нем куча методов полей( большая часть которых динамические масивы). В главном модуле создаю екземпляр этого класа, и вызываю некоторые из его методов, после этого вызываю деструктор и присваиваю переменной значений nil. Но после этих операций, если я запускал програму из самой среды, выскакивает сообщение о направильной работе с указателями (хотя вроде бы все ращеты програма производит), если же просто из винды, то сообщение об ошибке и после этого приложение можно вырубить только с диспетчера. В чем может быть проблема, или хотя бы как можно отследить эту ошыбку (просто пошагово протрасировать всеь процес от момента инициализации переменной этого класа до уничтожения, ничего не дает). Дело еще в том, что этот клас я создал как копию другого (не наследование, а просто скопировал код), притом тот другой клас работает без ошибок (в этом класе я внес небольшие изменения, но их я уже прослеживал не раз, и никаких отклонений не нашол). Клас в котором происходятошибки называется TTask2. Ошибка возникает если например в програму загрузить файл "розм1.txt" и запустить расщеты. Если кто-нибуть поймет в чем дело отпишите пожалуста. Исходный код и тестовый файл в прикрепленном архиве.
Вложения
Тип файла: rar 2.rar (100.7 Кб, 9 просмотров)

Последний раз редактировалось neo_m; 11.06.2008 в 22:12.
neo_m вне форума Ответить с цитированием
Старый 11.06.2008, 22:45   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Точно ошибка с указателями ?
У меня при выполнении только ошибка, связанная с преобразованием StrToFloat - в файле розм1.txt заменил точки на запятые и все работает.
Попробовал несколько раз загружать файл, делать расчет - ошибки не добился.

Правда, у меня нет компонента RXDice. Соответствующие ссылки на него я убрал.

А вообще класс достаточно большой. Причем инициализация внутренних переменных производится и в методах класса и внешними вызовами - сложно отследить где что меняется.

Если ошибка все-таки есть, советую протрассировать начиная с

TaskArrang:=TTask2.Create(limit,var iable,h);

в MainUnit до вызова

TaskArrang.Destroy.

// Не рекомендуется вызывать destroy напрямую. Лучше вызывайте free.
alexBlack вне форума Ответить с цитированием
Старый 11.06.2008, 23:24   #3
neo_m
 
Регистрация: 05.03.2008
Сообщений: 9
По умолчанию

Спасиба, что посмотрел. Но у меня действительно ошибка с указателями. Я даже не знаю, что делать, может это у меня в системе уже какойто глюк, или вирус. потому что при работе над этим проектом, при отладке я находил один глюк( один из динамических масивов у меня без всяких команд разименовывался, в смысле ни начто не указывал, при том я проходил пошагово от последнего места где этот масив еще указывал на даные, до того где он ни начто не указывает, и ничего так и не нашол). Возможно у меня действительно уже что-то с системой. Ладно еще раз спасибо, буду думать что делать (или еще рытся в коде или переустанавливать систему).
А насчет вызова деструктора, я даже не знаю, просто у меня там в класе используются поля типа TDynamMatrix, которые тоже являются класами и для них желательно использовать свои деструкторы (потому как в них идет работа с большими масивами памяти и е желательно освободить после использования). Но спасибо за совет, может попробую еще на другой машине откомпилировать проект.

Последний раз редактировалось neo_m; 11.06.2008 в 23:28.
neo_m вне форума Ответить с цитированием
Старый 12.06.2008, 11:31   #4
neo_m
 
Регистрация: 05.03.2008
Сообщений: 9
По умолчанию

Странно но я перепробовал запускать програму на разных машинах, с разными ОС (в смысле зборками, с разными прибамбасами и обикновенные окна) но результат остался тот же, при загрузке с файла и нажатии кнопки "Провести розрахунки" програма вылетает с появлением сообщения "Invalid pointer operation".
neo_m вне форума Ответить с цитированием
Старый 12.06.2008, 12:51   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

? Даже не знаю.
Не смог добиться такого эффекта.
Вот exe-шник, чтобы Вы смогли проверить. Может последовательность действий не та.
(Проверять весь код не воспроизведя ошибку достаточно утомительно).

В коде никаких исправлений (кроме того, что нет RxDice).
Загружаю файл с данными "файл/завантажити", розм1.txt, нажимаю "Провести розрахунки" - все работает.
Вложения
Тип файла: rar Combinator.rar (268.4 Кб, 7 просмотров)

Последний раз редактировалось alexBlack; 12.06.2008 в 13:05.
alexBlack вне форума Ответить с цитированием
Старый 12.06.2008, 13:07   #6
neo_m
 
Регистрация: 05.03.2008
Сообщений: 9
По умолчанию

Да нет, последовательность правильная, екзешник рботает нормально ( а компонент RxDice это чисто внешнее оформление, в расщетах он никак не участвует, он из библиотеки RxLib, такой кубик вращается). Вот ведь задача, даже не могу придумать в чем может быть причина. Я думал может быть у меня виндовс сборка ZverDVD (если слышал о такой), какой то не тако, может что-нибуть удалено нужное, но поставил виртуальную машину, установил самый обычную винду поставил Delphi но результат тот же. Потом уже пошел по знакомых, попробовал у них, то же самое. Я не знаю, может в настройках среды нужно что-то изменить, а то у меня все по умолчанию.
neo_m вне форума Ответить с цитированием
Старый 12.06.2008, 13:12   #7
neo_m
 
Регистрация: 05.03.2008
Сообщений: 9
По умолчанию

Кстати а какая версия Delphi? Я пользуюсь седьмой.
neo_m вне форума Ответить с цитированием
Старый 12.06.2008, 13:21   #8
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Случайно наткнулся:

unit DynArray:

fMemAllocated : word;
fMemAllocated := fDimension*sizeof(TDynArrayBaseType ); // 20000*8

----------------------------------------------------------------
У меня Turbo Delphi Explorer. А в D7 ошибка действительно возникает.

Range Checking error в строке
FC[Round(ST.Element[beginNewTable+NLimit+i+1,1])+3]:=0;
и портится какой-то указатель

Проверьте это выражение. Если эту строку закоментировать, ошибки не появляется.

Последний раз редактировалось alexBlack; 12.06.2008 в 14:20.
alexBlack вне форума Ответить с цитированием
Старый 12.06.2008, 14:25   #9
neo_m
 
Регистрация: 05.03.2008
Сообщений: 9
По умолчанию

Огромное спасиба, буду пробовать. Еще раз спасиба что уделили моей проблеме столько времени
neo_m вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите пожалуста с компонентом Terran Компоненты Delphi 3 02.02.2008 14:28
Помогите,пожалуста! Регина Помощь студентам 5 30.05.2007 23:02
Помогите пожалуста!!! juden Общие вопросы Delphi 2 23.05.2007 14:37
Помогите,пожалуста! Регина Помощь студентам 4 17.05.2007 01:19