Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странный глюк в Delphi 7. Поясните. 
:(
    Опции темы
CosmoMan
Дата 12.7.2005, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 12.7.2005
Где: Харьков

Репутация: 1
Всего: 0



Мне для аглоритма поименной сортировки понадобилось сделать массив
букв русского и английского алфавитов.
Я сделал в интерфейсной части модуля тип:
Код
type
   Alfavit = array[1..32] of record
                                           BigSymbol     :char;                                          
                                           SmalSymbol  :char;
                                         end;

Далее в разделе public одного из классов я объявил
две переменные типа Alfavit: RAlfawit и EAlfavit;
На событи TForm1.Create я поставил функцию, которая инициализировала
эти 2 переменные. Функция находилась в разделе private того же класса. Вот её фрагмент:
Код

j := 0;
for i := 1 to 43 do
begin
  j := j + 1;
  if i <= 32 then
  begin
    if i = 7 then    //для буквы ё 
    begin
      RAlfavit[j].BigSymbol := #168;  
      RAlfavit[j].SmalSymbol := #184;
      j := j + 1;  
    end;
    RAlfavit[j].BigSymbol := chr(191 + i);
    RAlfavit[j].SmalSymbol := chr(223 + i);
  end;
end;

Далее программа работает без видимых збоев, ошибок(исключений) и зависаний. Просто удивительно!!!
Ведь последняя итерация цикла i должна была неминуемо вызвать ошибку, т. к. элемента RAlfavit[33] не существует.
Однако после нажатия зактытия приложения выводится сообщение о том, что произошла ошибка освобождения памяти,
т. к. какойто указатель есть invalid. Если просто запустить приложение (*.exe) не через отладчик Delphi, то программа
благополучно завершится, однако процесс в Панели задачь останется не завершенным и память не освобожденной.
Не могу понять, как такую серьезную ошибку мог пропустить компилятор? smile

Это сообщение отредактировал(а) Alex - 12.7.2005, 22:38
PM MAIL   Вверх
Alex
Дата 12.7.2005, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



С точки зрения компилятора никакой ошибки нет и он совершенно прав, а вот метод заполнения массива вы выбрали очень экзотический...


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
CosmoMan
Дата 12.7.2005, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 12.7.2005
Где: Харьков

Репутация: 1
Всего: 0



Цитата
С точки зрения компилятора никакой ошибки нет

Тогда с какой точки зрения появляется ошибка
Цитата
метод заполнения массива вы выбрали очень экзотический

Посоветуйте тогда более на ваш взгляд рациональный код.

Ещё раз поясняю. При последней итерации получится, что
RAlfavit[33].BigSymbol := chr(191 + i);
RAlfavit[33].SmalSymbol := chr(223 + i);
Этого не может быть в принцыпе... smile
PM MAIL   Вверх
Alex
Дата 12.7.2005, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Я думаю, что вот так по проще код будет и вам и компилятору:
Код

var
  i: Integer;
begin
  // Буква "Ё"
  RAlfavit[7].BigSymbol  := #168;
  RAlfavit[7].SmalSymbol := #184;
  //
  for i := 1 to 43 do begin
    if i < 33 then begin
      if i = 7 then Continue;
      RAlfavit[i].BigSymbol  := chr(191 + i);
      RAlfavit[i].SmalSymbol := chr(223 + i);
    end;
  end;
end;

Добавлено @ 23:05
CosmoMan, не все можно определить на этапе компиляции. Вашу ошибку можно отнести к ошибке построения алгоритма расчета, такого рода ошибки компилятор не в состоянии определить


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
CosmoMan
Дата 12.7.2005, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 12.7.2005
Где: Харьков

Репутация: 1
Всего: 0



Спасибо за ответ. Теперь все ясно.
Насчет алгоритма
Вы проиграли одну итерацию цикла, зато сэкономили память..

ТЕМА ЗАКРЫТА.

P. S. Компилятор и такое должен уметь
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0445 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.