Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 270

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Активирую массивы. ( фрагмент //BAD ) Отработало нормально, пощелкал кнопками - ОК.Закрываю приложение - сообщение :

Project LOAD_REG.exe raised exception class EInvalidPointer with
message 'Invalid pointer operation'. Process stopped. Use Step or
Run to continue.

Казалось бы, ну и пусть, отработало ведь как надо. Но непорядок.Пораскинул серым веществом - получил вариант //GOOD - и система не возражает.
Вот и думаю : какое правило приличия Дельфи я нарушил? Не помогает ни объявление константной строки ' ', ни SetLength (ArrUMR,0) в обработчике закрытия приложения. И что любопытно, первый вариант без всяких нормально работает у меня в другом приложении.

Приложение:
  1.  
  2.  
  3. type
  4. str32 = string[32] ;
  5. .....
  6. var
  7. ArrUMR : array of str32 ;
  8. Imas : array of integer;
  9.  
  10.  
  11.  
  12. //BAD :
  13. procedure TForm1.FormActivate(Sender: TObject);
  14. var I : Integer;
  15. begin
  16. SetLength (IMas,5010) ; SetLength (ArrUMR,5010) ;
  17. for I:= 1 to 5010 do
  18. begin
  19. ArrUMR[I] := Copy(' ',1,6) ;
  20. IMas[I] := -1
  21. end ;
  22.  
  23. end;
  24.  
  25. // GOOD :
  26. procedure TForm1.FormActivate(Sender: TObject);
  27. var I : Integer;
  28. str000 : string[6] ;
  29. begin
  30. SetLength (IMas,5010) ; SetLength (ArrUMR,5010) ;
  31. str000 := Copy(' ',1,6) ;
  32. for I:= 1 to 5010 do
  33. begin
  34. ArrUMR[I] := Copy(str000,1,6) ;
  35. IMas[I] := -1
  36. end ;
  37.  
  38. end;
  39.  


Яуген Таляныч Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Яуген Таляныч (статус: Посетитель)
Вопрос отправлен: 11 октября 2009, 12:10
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Паровоз

Здравствуйте, Гена Гутницкий!
Динамические массивы индексируются с нуля. Поэтому надо for I:= 0 to 5009 do. А при I=5010 Вы разрушаете какие-то данные. Скорее всего заголовок следующего массива IMas, в котором хранится информация о его структуре.

Ответ отправил: Паровоз (статус: 10-ый класс)
Время отправки: 11 октября 2009, 12:52
Оценка за ответ: 4

Комментарий к оценке: Что начинаются дин.массивы с 0 - это я помню. Просто 0-й элемент я не использую. В самом деле, когда for i := 1 to 5000, то без эксцессов. Любопытно что если строкой-источником явлеяется локальная строка из обработчика, то все ОК. Но это уже представляет праздный интерес, бо компилятор неисчерпаем, как атом.
Спасибо!

Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 11 октября 2009, 22:01; участников в обсуждении: 2.
Яуген Таляныч

Яуген Таляныч (статус: Посетитель), 11 октября 2009, 12:14 [#1]:

Я имел в виду константной строки '' с N пробелами, но движок форума лишние пробелы в строке игнорировал, видимо.
Паровоз

Паровоз (статус: 10-ый класс), 11 октября 2009, 22:01 [#2]:

Дело не в том, что компилятор неисчерпаем, а в том, что память распределяется так или иначе. Поэтому иногда вы затираете несущественные данные, а иногда существенные, которые и вызывают исключение. Поэтому в любом случае доступ по индексу 5010 незаконен. А то, что это не вызывает исключения, то это еще хуже. Потому, что затирается какая-то переменная, которая может быть нужна в другом месте. И такая ошибка одна из самых труднонаходимых.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:44
Выполнено за 0.02 сек.