Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.04.2014, 02:30
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание Exception class ERangeError with message Range check error?

Почему программа начала выдавать такую ошибку?

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure CreateBuffer(Names: TStrings; var P: TBuffer);
var
 i, j, l : integer;
begin
 for i := 0 to Names.Count-1 do
  begin
   l:= Length(P);
   SetLength(P, L+Length(Names[i])+1);
   for J := 0 to Length(Names[i])-1 do
    begin
    if J > Length(Names[i])-1 then exit;
    P[L + J]:= Names[i] [J + 1];
    P[L + J]:= #0;
    end;
  end;
 SetLength(P, Length(P)+1);
 P[Length(P)]:= #0; // ошибка тут
end;


http://i7.picsplace.ru/images/230414...2100b6a88d.png
__________________
Нет ничего не возможного. Вопрос только во времени...

Последний раз редактировалось Electronic_Arts, 23.04.2014 в 02:33.
Ответить с цитированием
  #2  
Старый 23.04.2014, 04:29
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А что такое TBuffer? Динамический массив? Тогда там нумерация начинается с 0 и последний элемен имеет индекс Length()-1.
Ответить с цитированием
  #3  
Старый 23.04.2014, 08:29
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание

Код:
1
2
type
 TBuffer = array of Char;


Код:
1
2
3
SetLength(P, Length(P)+1);
 P[Length(P)]:= #0;
end;
но ведь мы же размер увеличиваем на единицу почему -1??

И еще одно это проблема начала возникать после того как я решил все предупреждения в логах... до этого все работало без ошибок
и все предупреждения которые были решены не имели отношения к этой процедуре...
__________________
Нет ничего не возможного. Вопрос только во времени...
Ответить с цитированием
  #4  
Старый 23.04.2014, 10:04
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

но ведь мы же размер увеличиваем на единицу почему -1??
после того, как размер увеличиваем на единицу, ты берёшь Length(P), который уже стал больше на единицу.
например, Length(P) = 5;
после
Код:
1
SetLength(P, Length(P)+1);
Length(P) = 6;
а здесь и будет ошибка
Код:
1
P[Length(P)]:= #0;
Ответить с цитированием
  #5  
Старый 23.04.2014, 10:05
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Electronic_Arts
Код:
1
2
type
 TBuffer = array of Char;


Код:
1
2
3
SetLength(P, Length(P)+1);
 P[Length(P)]:= #0;
end;
но ведь мы же размер увеличиваем на единицу почему -1??
Размер увеличили, поэтому Length(P) во второй строке вернёт число на единицу больше чем Length(P) в первой строке и опять будет выход за пределы массива, поэтому увеличивай хоть на "тыщу", но такая строка для динамических массивов буде всегда некорректной:
Код:
1
P[Length(P)]
Нужно делать либо так:
Код:
1
P[Length(P) - 1]
либо так:
Код:
1
P[High(P)]
Цитата:
Сообщение от Electronic_Arts
И еще одно это проблема начала возникать после того как я решил все предупреждения в логах... до этого все работало без ошибок
Я не понимаю что значит "решил все предупреждения в логах"...
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Electronic_Arts (23.04.2014)
  #6  
Старый 23.04.2014, 11:10
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание

Цитата:
Сообщение от poli-smen
Я не понимаю что значит "решил все предупреждения в логах"...
После компиляции в окне Messages в Delphi отображаются предупреждения если они имеются в программе
(например какая та переменная не используется и все такое создал для проверки кода потом забыл)

poli-smen СПАСИБО
High(p) - решил проблему...
__________________
Нет ничего не возможного. Вопрос только во времени...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:10.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025