Ошибка range check error

0 / 0 / 0

Регистрация: 08.10.2010

Сообщений: 134

1

18.12.2011, 16:27. Показов 43854. Ответов 6


Студворк — интернет-сервис помощи студентам

Здравствуйте. Что означает ошибка Range check error? У меня при частой записи в Memo Выдается эта ошибка. На работу программы не влияет. Просто окошко и все. Как это исправить или где заглушку ставить?



0



LK

Заблокирован

18.12.2011, 16:57

2

 Комментарий модератора 
Fusix, Правила

3.3. Запрещено создавать темы с бессмысленными названиями вроде «Помогите!», «Вопрос» и т.п.

Изначальное название темы: «Ошибка».

И для начала заведите себе англо-русский словарик, коль учить язык, который является основой для другого языка — на котором вы пытаетесь программировать, желания нет



0



1364 / 731 / 67

Регистрация: 28.01.2011

Сообщений: 2,058

18.12.2011, 17:40

3

Ошибка проверки диапазона!



1



0 / 0 / 0

Регистрация: 08.10.2010

Сообщений: 134

18.12.2011, 19:46

 [ТС]

4

Цитата
Сообщение от Samrisbe
Посмотреть сообщение

Ошибка проверки диапазона!

Как их диагностировать и исправлять?



0



1364 / 731 / 67

Регистрация: 28.01.2011

Сообщений: 2,058

18.12.2011, 20:08

5

Если массив объявлен как 1..1, то в нём и будет ровно один элемент, и в переменной a будет только один элемент. Попытка обратиться к a[2] и т. д. вызовет ошибку.



1



37 / 37 / 6

Регистрация: 20.03.2011

Сообщений: 331

19.12.2011, 15:15

6

Это ошибка происходит когда обращаешься к несуществующей памяти



1



Morgot

257 / 100 / 17

Регистрация: 26.12.2010

Сообщений: 437

26.01.2012, 22:18

7

Этот билдер меня каждый день радует. Пишу код:

C++
1
2
3
4
5
6
IdHTTP1->HandleRedirects=true;
 
//AnsiString resp;
//resp = IdHTTP1->Get("http://google.com");
 
Memo1->Text=IdHTTP1->Get("http://google.com");

На других сайтах работает норм, на гугле выдает ошибку «range check error» (хоть через строку передавать данные, хоть напрямую).
В дельфи аналогичный код такого не дает.



0



ошибка

Что обозначает ошибка Range Check Error при использовании NMHTTP???

8 ответов

1

11 ноября 2005 года

kot_

7.3K / / 20.01.2000

Цитата:

Originally posted by Zephyr
Что обозначает ошибка Range Check Error при использовании NMHTTP???

Range Check Error генерируется как правило в случае если происходит попытка обращения к элементу массива по несуществующему индексу. NMHTTP возможны такие исключения в случае если происходит чтение строковых свойств класса без проверки размера.

1.3K

12 ноября 2005 года

Zephyr

104 / / 03.05.2005

Цитата:

Originally posted by kot_
Range Check Error генерируется как правило в случае если происходит попытка обращения к элементу массива по несуществующему индексу. NMHTTP возможны такие исключения в случае если происходит чтение строковых свойств класса без проверки размера.

Извините конечно, но я не совсем понял… Тоесть вы сказали, что Параметр, отправленный мной компоненту NMHTTP слишком длинный (Ошибка выдаётся, при подставлении мной слишкого параметра в NMHTTP->Header(my_param))?
А какова максимальная возможная длина параметра???

1

12 ноября 2005 года

kot_

7.3K / / 20.01.2000

Цитата:

Originally posted by Zephyr
Извините конечно, но я не совсем понял… Тоесть вы сказали, что Параметр, отправленный мной компоненту NMHTTP слишком длинный (Ошибка выдаётся, при подставлении мной слишкого параметра в NMHTTP->Header(my_param))?
А какова максимальная возможная длина параметра???

Опиши, что и как ты передаешь. Мне воспроизвести ошибку не удалось в нормальных условиях.

1.3K

12 ноября 2005 года

Zephyr

104 / / 03.05.2005

Цитата:

Originally posted by kot_
Опиши, что и как ты передаешь. Мне воспроизвести ошибку не удалось в нормальных условиях.

Я делаю построковую выборку из текстового файла и подставляю эти значения (из выборки) в NMHTTP->Header. На какой-то строке цикл обрывается и выводится ошибка Range Check Error.

1

12 ноября 2005 года

kot_

7.3K / / 20.01.2000

Цитата:

Originally posted by Zephyr
Я делаю построковую выборку из текстового файла и подставляю эти значения (из выборки) в NMHTTP->Header. На какой-то строке цикл обрывается и выводится ошибка Range Check Error.

Приведи код — считывания из файла и записи в хедер.

1.3K

12 ноября 2005 года

Zephyr

104 / / 03.05.2005

Цитата:

Originally posted by kot_
Приведи код — считывания из файла и записи в хедер.

Код:

TStringList* Strings = new TStringList;


Strings->LoadFromFile(«somefile.txt»);
int i=Strings->Count;

 for(int k=1; k<i; k++)
     {
         NMHTTP1->Head(URLEdit->Text
           +Strings->Strings[k]);
     }

1

13 ноября 2005 года

kot_

7.3K / / 20.01.2000

Цитата:

Originally posted by Zephyr

Код:

TStringList* Strings = new TStringList;


Strings->LoadFromFile(«somefile.txt»);
int i=Strings->Count;

 for(int k=1; k<i; k++)
     {
         NMHTTP1->Head(URLEdit->Text
           +Strings->Strings[k]);
     }

Проверь содержание строкового массива. В целом код работает и подобных ошибок быть не должно. Например, содержание файла somefile.txt

Код:

/showthread.php?s=&postid=115401#post115401

и урл — «http://forum.codenet.ru», возвращает нормальный заголовок, без всяких ошибок.
Так же зайди в опции проекта, на закладку Паскаль и убери галочку в Range checking — посмотри какое исключение будет сгенерированно.

1.3K

13 ноября 2005 года

Zephyr

104 / / 03.05.2005

Ошибка выдаётся на строке:

NMHTTP1->Head(URLEdit->Text
+Strings->Strings[k]);

И ещё — где можно почитать доки по сетевому кодингу на ВС++В (в частности по компоненту NMHTTP)???

I have seen too many Delphi programmers writing quite large programs without ever activating Range, Overflow and Assertion checking. Of course, you can do that if you want, but your code will be more buggy.

So, if you allow me let me insert a parallel (bug still relevant) and to your question, in the hope to convince more programmers to enable these 3 checking right now. A word of warning also included at the end.


Overflow checking

This will check certain integer arithmetic operations (+, -, *, Abs, Sqr, Succ, Pred, Inc, and Dec) for overflow. For example, after a + (addition) operation the compiler will insert additional binary code that verifies that the result of the operation is within the supported range.

An «integer overflow» occurs when an operation on an integer variable produces a result that is outside the range of that variable. For example, if an integer variable is declared as a 16-bit signed integer, its value can range from -32768 to 32767. If an operation on this variable produces a result greater than 32767 or less than -32768, an integer overflow has occurred.

When an integer overflow occurs, the result of the operation is undefined and can lead to undefined behavior in the program:
• Wrap-around
The result might result in a wrapped-around value. This means that the number 32768 will be actually stored as 1 since it is 1 unit higher than the highest value we can store (32767).
• Truncation
The result may be truncated or otherwise modified to fit within the range of the integer type. For example, the number 32768 will be actually stored as 32767 since that is the highest value we can store.

Undefined program behavior is one of the worst kind of errors, because it is not an error easy to reproduce. Therefore, it is difficult to track and repair.

There is a small price to pay if you activate this: the speed of the program will decrease slightly.

IO checking

Checks the result of an I/O operation. If an I/O operation fails, an exception is raised. If this switch is off, we must check for I/O errors manually.
There is a minor price to pay if you activate this: the speed of the program will decrease, but insignificantly because the few microseconds introduced by this check is nothing compared with the millisecond-range time required by the I/O operation itself (the hard drives are slow).

Range Checking

The Delphi Geek calls this “The most important Delphi setting” and I totally agree. It checks if all array and string indexing expressions are within the defined bounds. It also checks that all assignments to scalar and subrange variables are within range.

Here is an example of code that would ruin our life if Range Checking would not be available:

Type 
    Pasword= array [1..10] of byte; // we define an array of 10 elements
…
x:= Pasword[20];       // Range Checking will prevent the program from accessing element 20 (ERangecheckError exception is raised). Security breach avoided. Error log automatically sent to the programmer. Bruce Willis saves everyone.

Enabling Runtime Error Checking

To activate the Runtime Error Checking, go to Project Options and check these three boxes:

Enabling the Runtime Error Checking in ‘Project Options’
enter image description here

Assertions

A good programmer MUST use assertions in its code to increase the quality and stability of the program. Seriously man! You really need to use them.

Assertions are used to check for conditions that should always be true at a certain point in the program, and to raise an exception if the condition is not met. The Assert procedure, which is defined in the SysUtils unit, is typically used to perform assertions.

You can think of assertions as poor man’s unit testing. I strongly advise you to look deeper into assertions. They are very useful and do not require as much work as unit testing.

Typical example:

SysUtils.Assert(Input <> Nil, ‘The input should not be nil!’);

But for the program to check our assertions, we need to active this feature in the Project Settings -> Compiler Options, otherwise they will simply be ignored, like they are not there in our code. Make sure that you understand the implications of what I just said! For example, we screw up badly if we call routines that have side effects in the Assert. In the example below, during Debugging when the assertions are on, the Test() function will be executed and ‘This was executed’ will appear in the Memo. However, during Release more, that text will not appear in the memo because now Assert is simply ignored. Congratulations we just made the program to behave differently in debug/release mode ☹.

function TMainForm.Test: Boolean;
begin
 Result:= FALSE;
 mmo.Lines.Add('This was executed');
end;

procedure TMainForm.Start;
VAR x: Integer;
begin
 x:= 0;
 if x= 0
 then Assert(Test(), 'nope');
end;

Here are a few examples of how it can be used:

1 To check if an input parameter is within the 0..100 range:

procedure DoSomething(value: Integer);
begin
  Assert((value >= 0) and (value <= 100), 'Value out of range');
  …
end;

2 To check if a pointer is not nil before using it:

Var p: Pointer;
Begin
  p := GetPointer;
  Assert(Assigned(p), 'Pointer is nil');
   …
End;

3 To check if a variable has a certain value before proceeding:

var i: Integer;
begin
   i := GetValue;
   Assert(i = 42, 'Incorrect response to “What is the answer to life”!');
  …
end;

Assertions can also be disabled by defining the NDEBUG symbol in the project options or by using the {$D-} compiler directives.

We can also use the Assert as a more elegant way of handling errors and exceptions in some cases, as it can be more readable and it also includes a custom message, that would help the developer understand what went wrong.

Personally, I use it a lot at the top of my routines to check if the parameters are valid.

Activating this feature will (naturally) make your program slower because… well, there is one extra line of code to execute.

Nothing comes for free

Everything nice comes with a price (fortunately a small price in our case): enabling Runtime error checking and Assertions slows down our program and makes it somewhat larger.

Computers today have lots of RAM so the slight increase in size is irrelevant, so, let’s put that aside. But let’s look at the speed, because that is not something we can easily ignore:

Type                 Disabled   Enabled
Range checking       73ms         120ms
Overflow checking    580ms        680ms
I/O checking         Not tested   Not tested

As we can see the program’s speed is strongly impacted by these runtime checking. If we have a program where speed is critical, we better activate “Runtime error checking” during debugging only. What I do, I also leave it active in the first release and wait a few weeks. If no bugs are reported, then I release an update in which “Runtime error checking” is off.

Personally, I leave the “IO checking” always active. The performance hit because of this check is microscopic.


Big warning:
If you have an existing project that was not so nicely written, and you activate any of the Runtime Error checking below, your program may will crash more often than usual.
No, the Runtime Error checking routines did not break your program. It was always broken – you just didn’t know. The Runtime Checking routines are now finding all those places where the code is fishy and shitty and smelly. The sole purpose of Runtime Checking is to find bugs in your program.

Умея
пользоваться массивами, условными
операторами и операторами цикла, вы
можете писать довольно серьезные
программы. При выполнении этих программ
неизбежно будут возникать критические
ошибки, приводящие к аварийному завершению
программы. Такие ошибки по английски
называются Run-time errors — ошибки времени
выполнения. Рассмотрим пока только
наиболее часто встречающиеся арифметические
ошибки:

Division
by zero — код ошибки 200;

Arithmetic
overflow — код ошибки 215;

Range
check error — код ошибки 201;

Floating
point overflow — код ошибки 205;

Invalid
floating point operation — код ошибки 207.

Ошибка
Division
by zero

— деление на ноль — возникает при выполнении
операций DIV,
MOD

и /,
когда делитель равен нулю.

Ошибка
Arithmetic overflow

— целочисленное переполнение — возникает
при выполнении арифметической операции
над целыми числами, когда результат
операции выходит за границы соответствующего
типа. Такая ошибка произойдет, например,
при выполнении программы

VAR
a,b : Word; c : Integer; BEGIN a:=100; b:=200; c:=a-b; END.

Ошибка
произошла, когда вычислилось значение
выражения a-b,
равное -100.
Мы знаем, что при выполнении операции
над операндами типа Word
результат будет иметь тип Word,
а -100 не является допустимым значением
этого типа. То обстоятельство, что это
значение мы собирались присвоить
переменной типа Integer,
не
имеет значения, т.к. ошибка произошла
до
присваивания. Интересно, что, если
описать a
и
b

как
Byte
,
то ошибки не будет (см. таблицу 2 в главе
5).

Ошибка
Range
check error

— ошибка проверки диапазона — происходит
в двух случаях. Во-первых, при попытке
присвоить целочисленной переменной
недопустимое значение, и, во-вторых, при
использовании недопустимого индексного
выражения для элемента любого массива.
Проиллюстрируем оба эти случая на
простых примерах.

VAR
a,b,c : Word; BEGIN a:=$FFFF; b:=1; c:=a+b; END.

Мы
попытались присвоить переменной типа
Word
значение 65536, которое не является
допустимым для этого типа.

VAR
x : ARRAY[2..8] OF Real; i : Byte;

BEGIN
FOR i:=8 DOWNTO 1 DO x[i]:=Sqrt(i); END.

Ошибка
произошла при обращении к первому
элементу массива, который не существует.
Фактически этот второй случай полностью
аналогичен первому — мы попытались
«присвоить» индексу массива, тип
которого-2..8, значение 1.

Ошибка
Floating
point overflow

— вещественное переполнение — возникает
при выполнении операции над вещественными
числами, когда результат операции
слишком велик, или при попытке присвоить
вещественной переменной слишком большое
значение. Когда речь идет о вещественных
числах, термин «слишком большое»
следует понимать как большое по абсолютной
величине — знак числа не имеет значения.
Приведем пример программы, содержащей
такую ошибку.

VAR
r : Real; BEGIN r:=-1E20; r:=Sqr(r); END.

При
возведении в квадрат величины r
мы получим слишком большое для типа
Real
число
1E40.

Ошибка
Invalid
floating point operation

возникает в трех случаях:

1)
при вычислении корня из отрицательного
числа;

2)
при вычислении логарифма неположительного
числа;

3)
при вычислении функций Trunc и Round от
слишком большого (по абсолютной величине)
вещественного числа. Эта ошибка довольно
очевидна, и мы не станем ее иллюстрировать.

Как
же должен поступать программист, когда
при выполнении его программы возникают
ошибки? Прежде всего нужно локализовать
ошибку, то есть найти оператор, в котором
она произошла. В этом вам может помочь
среда Turbo Pascal, если в ней правильно
установлены опции
компилятора
.
Опции компилятора позволяют изменять
режим компиляции и задаются в подменю
Compiler
меню Options
среды Turbo Pascal. Пока нас будут интересовать
лишь пять опций: Range
checking
,
Stack
cheking
,
I/O
checking
,
Overflow
checking
,
Debug
information.
Если они включены, то настройка среды
благоприятна для отладки вашей программы.
Если они выключены, то их обязательно
следует включить, а еще лучше задать их
непосредственно в тексте своей программы.
Опции записываются в программе в виде:

{$
буква
+
/
}

Каждой
опции соответствует своя буква (эти
буквы выделены в подменю Compiler
цветом), символ «+» означает включить,
а символ «-» — выключить. В программе
можно задать одну опцию, например, {$R+}
или несколько опций — {$R+,I-,S+}
. Некоторые опции можно записывать
только в самом начале программы, другие
могут размещаться в любом ее месте.

Опция
Range
checking

(R) отвечает за контроль ошибок Range
check error
,
Overflow
checking

(C) — за контроль ошибок Ariphmetic
overflow
,
I/O
cheking

(I) — за контроль ошибок ввода-вывода.
Смысл опции Stack
cheking

(S) будет объяснен несколько позже, а
опция Debug
information

(D) включает в код программы отладочную
информацию, что позволяет среде Turbo
Pascal при аварийном завершении программы
показать курсором оператор, в котором
произошла ошибка. Позаботьтесь, чтобы
при отладке программы перед первым ее
оператором была строка {$R+,C+,I+,S+,D+}
— это поможет вам найти и устранить все
ошибки. Некоторые неопытные программисты
выключают эти опции, тогда программа
не прерывается при некоторых ошибках,
а продолжает выполняться, на этом
основании делается вывод, что программа
верна. Это самообман — программа
выполняется, но выполняется неправильно
и никак не сообщает об ошибках.

Соседние файлы в папке Учебники

  • #
  • #

 
San1712
 
(2007-12-01 06:58)
[0]

Расположенное ниже сообщение появляется во время выполнения программы. Как я понимаю в нём говорится что где переменная маленького размера. Но проблема в том что эта ошибка возникает в том месте там где нет ошибки, у меня уже такое было, как автоматизировать поиск ошибки ?

Project Project1.exe raised exception class ERangeError with message «Range check error». Process stopped. Use Step or Run to continue.


 
homm ©
 
(2007-12-01 08:21)
[1]

> Но проблема в том что эта ошибка возникает в том месте там
> где нет ошибки

Значит ошибка где-то жо этого места.


> как автоматизировать поиск ошибки

Нанять программиста.


 
Kolan ©
 
(2007-12-01 09:54)
[2]

Скорее всего ты вылез за границы массива. Массивы есть в программе?


 
Igor Zorkov ©
 
(2007-12-01 10:00)
[3]


> San1712   (01.12.07 06:58)
> Возникает сообщение об ошибке как его обработать ?

В меню Tools>Debugger Options>Language Exceptions>Add… добавить ERangeError

try
 код
 except
 on E: ERangeError do
   ShowMessage("FUCKING ERROR");
 end;


 
Kolan ©
 
(2007-12-01 10:03)
[4]

> В меню Tools>Debugger Options>Language Exceptions>Add&#133
> добавить ERangeError

А это зачем делать, объясни?


 
Igor Zorkov ©
 
(2007-12-01 10:24)
[5]


> Kolan ©   (01.12.07 10:03) [4]

Start>All Programs>Borland Delphi 7>Help>Using Delphi


 
Anatoly Podgoretsky ©
 
(2007-12-01 10:53)
[6]


> Igor Zorkov ©   (01.12.07 10:24) [5]

Это не объяснение


 
Igor Zorkov ©
 
(2007-12-01 11:07)
[7]


> Anatoly Podgoretsky ©   (01.12.07 10:53) [6]

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


 
Anatoly Podgoretsky ©
 
(2007-12-01 11:15)
[8]

Это не ошибка компилятора.

> во время выполнения программы

во время выполнения программы компилятор не работает.


 
Igor Zorkov ©
 
(2007-12-01 11:18)
[9]


> Anatoly Podgoretsky ©   (01.12.07 11:15) [8]

Ну куда мне с вами спорить Анатолий, я пас, просто пытался как то помочь San1712.


 
Anatoly Podgoretsky ©
 
(2007-12-01 11:45)
[10]

> Igor Zorkov  (01.12.2007 11:07:07)  [7]

Повторяю это ошибка не из компилятора.


 
Anatoly Podgoretsky ©
 
(2007-12-01 11:47)
[11]

Ему трудно помочь, поскольку он говорит, что ошибка возникает там, где нет ошибки. Нужно чудо.


 
Kolan ©
 
(2007-12-01 11:51)
[12]

> На мой взгляд все очень просто

Я спросил лиш по тому что ваш код и без этой настройки сработает нормально, но автор незнает где его писать у неоже ошибка в другом месте возникает&#133


 
Anatoly Podgoretsky ©
 
(2007-12-01 11:57)
[13]


> Скорее всего ты вылез за границы массива. Массивы есть в
> программе?

Эта ошибка возникает для любых диапазонов, но не только в массивах.


 
Kolan ©
 
(2007-12-01 12:52)
[14]

> Эта ошибка возникает для любых диапазонов, но не только
> в массивах.

Из опыта моего обычно дело в массивах(строках)&#133


 
Юрий Зотов ©
 
(2007-12-01 12:58)
[15]

> San1712   (01.12.07 06:58)

Это ошибка выхода за диапазон. Возникает она в двух случаях:

1. Переменной пытаются присвоить слишком большое или слишком маленькое для нее значение. Например, переменной типа byte пытаются присвоить значение -1, или 1000.

2. Пытаются обратиться к несуществующему элементу массива. Например, массив содержит 101 элемент с индексами от -50 до +50, а пытаются обратиться к 51-му элементу.

> эта ошибка возникает в том месте там где нет ошибки

Вам самому-то не смешно читать такие заявления?

Ошибка не может

возникать

там, где ее нет. Так не бывает. Она может

проявляться

там, где ее нет — вот такое бывает. Значит, либо ошибка все же есть, либо возникает не там, где Вы думаете.

==========================

1. Запустите программу под отладчиком. Когда появится сообщение об ошибке просмотрите стек вызовов. Поставтьте точку останова на одну строку раньше той, которая привела к ошибке и снова запустите программу под отладчиком.

2. Программ должна без всяких ошибок прийти на точку останова. Если это не так — повторяйте п. 1 и 2 до тех пор, пока:
— не придете на точку останова без ошибок.
— и при этом нажатие F8 выдает ошибку.

3. Ошибка возникает в той строке, на которой стоит точка останова (но это не значит, что причина ошибки тоже в этой же строке, она может быть и в другом месте). Еще раз запустите программу и когда придете на точку останова — анализируйте подозрительные участки кода (на предмет выхода за границы массива) и проверяйте значения переменных (на предмет выхода за диапазон возможных значений).


Like this post? Please share to your friends:
  • Ошибка ram ваз 2107
  • Ошибка rage plugin hook для гта 5
  • Ошибка rage multiplayer gta v installation path
  • Ошибка rage mp gta 5 installation patch
  • Ошибка rage mp game injection has time out