| 
| 
 | Вопрос # 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) в обработчике закрытия приложения. И что любопытно, первый вариант без всяких нормально работает у меня в другом приложении.
 Приложение:Переключить в обычный режим   type  str32 = string[32] ;.....var  ArrUMR : array of str32 ;  Imas : array of integer;   //BAD :procedure TForm1.FormActivate(Sender: TObject);var I : Integer;begin   SetLength (IMas,5010) ; SetLength (ArrUMR,5010) ;    for I:= 1 to 5010 do      begin        ArrUMR[I] := Copy('      ',1,6) ;         IMas[I] := -1      end ; end; // GOOD :procedure TForm1.FormActivate(Sender: TObject);var I : Integer;str000 : string[6] ;begin   SetLength (IMas,5010) ; SetLength (ArrUMR,5010) ;   str000 := Copy('      ',1,6) ;    for I:= 1 to 5010 do      begin        ArrUMR[I] := Copy(str000,1,6) ;        IMas[I] := -1      end ; end; 
|  |   Вопрос задал: Яуген Таляныч (статус: Посетитель)Вопрос отправлен: 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 незаконен. А то, что это не вызывает исключения, то это еще хуже. Потому, что затирается какая-то переменная, которая может быть нужна в другом месте. И такая ошибка одна из самых труднонаходимых. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |