![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| CosmoMan |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 110 Регистрация: 12.7.2005 Где: Харьков Репутация: 1 Всего: 0 |
Мне для аглоритма поименной сортировки понадобилось сделать массив
букв русского и английского алфавитов. Я сделал в интерфейсной части модуля тип:
Далее в разделе public одного из классов я объявил две переменные типа Alfavit: RAlfawit и EAlfavit; На событи TForm1.Create я поставил функцию, которая инициализировала эти 2 переменные. Функция находилась в разделе private того же класса. Вот её фрагмент:
Далее программа работает без видимых збоев, ошибок(исключений) и зависаний. Просто удивительно!!! Ведь последняя итерация цикла i должна была неминуемо вызвать ошибку, т. к. элемента RAlfavit[33] не существует. Однако после нажатия зактытия приложения выводится сообщение о том, что произошла ошибка освобождения памяти, т. к. какойто указатель есть invalid. Если просто запустить приложение (*.exe) не через отладчик Delphi, то программа благополучно завершится, однако процесс в Панели задачь останется не завершенным и память не освобожденной. Не могу понять, как такую серьезную ошибку мог пропустить компилятор? Это сообщение отредактировал(а) Alex - 12.7.2005, 22:38 |
||||
|
|||||
| Alex |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4147 Регистрация: 25.3.2002 Где: Москва Репутация: 80 Всего: 162 |
С точки зрения компилятора никакой ошибки нет и он совершенно прав, а вот метод заполнения массива вы выбрали очень экзотический...
-------------------- Написать можно все - главное четко представлять, что ты хочешь получить в конце. |
|||
|
||||
| CosmoMan |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 110 Регистрация: 12.7.2005 Где: Харьков Репутация: 1 Всего: 0 |
Тогда с какой точки зрения появляется ошибка
Посоветуйте тогда более на ваш взгляд рациональный код. Ещё раз поясняю. При последней итерации получится, что RAlfavit[33].BigSymbol := chr(191 + i); RAlfavit[33].SmalSymbol := chr(223 + i); Этого не может быть в принцыпе... |
||||
|
|||||
| Alex |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4147 Регистрация: 25.3.2002 Где: Москва Репутация: 80 Всего: 162 |
Я думаю, что вот так по проще код будет и вам и компилятору:
Добавлено @ 23:05 CosmoMan, не все можно определить на этапе компиляции. Вашу ошибку можно отнести к ошибке построения алгоритма расчета, такого рода ошибки компилятор не в состоянии определить -------------------- Написать можно все - главное четко представлять, что ты хочешь получить в конце. |
|||
|
||||
| CosmoMan |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 110 Регистрация: 12.7.2005 Где: Харьков Репутация: 1 Всего: 0 |
Спасибо за ответ. Теперь все ясно.
Насчет алгоритма Вы проиграли одну итерацию цикла, зато сэкономили память.. ТЕМА ЗАКРЫТА. P. S. Компилятор и такое должен уметь |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |