|
Вопрос # 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 незаконен. А то, что это не вызывает исключения, то это еще хуже. Потому, что затирается какая-то переменная, которая может быть нужна в другом месте. И такая ошибка одна из самых труднонаходимых.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|