Что такое range check error

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

Содержание

  1. 12. Ошибки при выполнении программы. Опции компилятора
  2. Ошибка Range check error
  3. #1 mikpav
  4. #2 mikpav
  5. #3 admin
  6. #4 Матрос
  7. #5 Лена
  8. Прикрепленные файлы
  9. #6 Матрос
  10. Блог GunSmoker-а
  11. 19 апреля 2009 г.
  12. Настройки проектов в Delphi с точки зрения поиска ошибок
  13. О чём идёт речь
  14. Что означают эти опции?
  15. Обычное приложение без механизма диагностики исключений
  16. Общие настройки для любых профилей
  17. Профиль Debug
  18. Профиль Release
  19. Приложение с механизмом диагностики исключений (типа EurekaLog, JCL или madExcept)
  20. Общие настройки любых профилей
  21. Профиль Debug
  22. Профиль Release
  23. Что может пойти не так, если настройки будут заданы неверно?

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

Умея пользоваться массивами, условными операторами и операторами цикла, вы можете писать довольно серьезные программы. При выполнении этих программ неизбежно будут возникать критические ошибки, приводящие к аварийному завершению программы. Такие ошибки по английски называются 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 цветом), символ «+» означает включить, а символ «-» — выключить. В программе можно задать одну опцию, например, или несколько опций — . Некоторые опции можно записывать только в самом начале программы, другие могут размещаться в любом ее месте.

Опция Range checking (R) отвечает за контроль ошибок Range check error, Overflow checking (C) — за контроль ошибок Ariphmetic overflow, I/O cheking (I) — за контроль ошибок ввода-вывода. Смысл опции Stack cheking (S) будет объяснен несколько позже, а опция Debug information (D) включает в код программы отладочную информацию, что позволяет среде Turbo Pascal при аварийном завершении программы показать курсором оператор, в котором произошла ошибка. Позаботьтесь, чтобы при отладке программы перед первым ее оператором была строка — это поможет вам найти и устранить все ошибки. Некоторые неопытные программисты выключают эти опции, тогда программа не прерывается при некоторых ошибках, а продолжает выполняться, на этом основании делается вывод, что программа верна. Это самообман — программа выполняется, но выполняется неправильно и никак не сообщает об ошибках.

Источник

Ошибка Range check error

#1 mikpav

  • Пользователи
  • 5 сообщений
    • Город: г. Санкт-Петербург

    #2 mikpav

  • Пользователи
  • 5 сообщений
    • Город: г. Санкт-Петербург

    #3 admin

  • Главные администраторы
  • 312 сообщений
    • Пол: Мужчина
    • Город: ПОТОК

    mikpav (29.5.2009, 10:53) писал:

    #4 Матрос

  • Администраторы
  • 940 сообщений
    • Пол: Мужчина
    • Город: Поток

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

    Накопитель подобных «казусов» при подачи данных постоянно пополняется после анализа присланных примеров.

    Вот результаты расчета одной из присланных для анализа систем:-
    В системе есть стояки из одного прибора (22 шт!).
    Нагрузка на отопительный прибор иногда 13 ватт или 30 ватт, или 40 ватт.

    О чём же думает конструктор глядя на свою схему? Как он уверенно обвиняет ПОТОК в отвратительной работе — не считает! Затыкается! Обманули, деньгу содрали за просто так!
    Подсунули вот Вам туфту — «сырую поделку» за деньги. Да ещё она, эта поделка, » ругается на иностранном языке«.
    Обращается к руководству фирму и директор подписывает письмо-рекламацию в адрес руководства ЗАО ПОТОК:

    Срочно приходится реабилитироваться. Извиняться. Обязуемся вставить доп. контроль в программу — «сито/подстраховку» на «некорректную подачу данных».
    И нелогично же отвечать директору «прямым текстом». Этика. Писать надо «витиевато» = виноват, исправлюсь.

    #5 Лена

  • Пользователи
  • 2 сообщений
  • Прикрепленные файлы

    #6 Матрос

  • Администраторы
  • 940 сообщений
    • Пол: Мужчина
    • Город: Поток

    Лена (10 Сентябрь 2013 — 17:13) писал:

    Зачем Вы так написали в таблице магистрали?

    3 0 4 100 .
    -4 0 -3 101 .

    надо бы во второй строке 4 и 3 писать без знака, а 101 указать с минусом. Так рекомендовано формировать данные в Инструкцию пользователю программы ПОТОК. Но Вы Инструкции игнорируете. Кто Вам порекомендовал указать «-4» и «-3» ?
    Данные подаете как попало, как в ум взбредёт, потом ругаете и программу и костерите авторов. :fool:/>

    У Вас всего две ветки и у них автоматически межветочные магистрали симметричны по нагрузке. Но Вы во второй строке ветки обозначили со знаком «-«. Так не предусмотрено нынче в однотрубном исполнении — так (знаком «-«) обозначались раньше пред включенные стояки лестничных клеток.
    Если системы несимметричные по нагрузке в межветочных трубах, то согласно «Руководства пользователю ПОТОК», вначале описывается подающая часть от ТП — «встать» на трубу и последовательно описать все сборные участки до веток. Затем обратная записывается часть по направлению к ТП.
    Таким образом, первый подающий сборный участок и последний обратный будут иметь нагрузку всей системы.
    Первый сборный участок трубы обратного теплопровода помечается разделителем, знаком «-«.

    Все — больше никаких «минусов» в таблице быть не должно.

    Вынуждены внести в программу доп_контроль данных:

    Источник

    Блог GunSmoker-а

    . when altering one’s mind becomes as easy as programming a computer, what does it mean to be human.

    19 апреля 2009 г.

    Настройки проектов в Delphi с точки зрения поиска ошибок

    О чём идёт речь

    Сначала, давайте посмотрим на них: открываем Project/Options. Нас будут интересовать вкладки Compiling и Linking (в старых версиях Delphi они назывались Compiler и Linker):

    На вкладке «Compiler» нас будут интересовать опции «Stack Frames», группа «Debug information», «Local Symbols» и «Symbol reference info», «I/O Checking», «Overflow checking» и «Range checking». На «Linking» — «Map file», «Debug Information» (известная в предыдущих версиях Delphi как «Include TD32 debug info») и «Include remote debug symbols».

    Давайте посмотрим, за что отвечают эти опции. А затем — как их лучше бы всего расставить. При этом мы будем рассматривать такие ситуации: обычное приложение и приложение с механизмом диагностики исключений.
    Кроме того, настройки проекта могут отличаться, компилируете ли вы приложение для себя или для распространения. В новых версиях Delphi появились профили настроек (Debug и Release, соответственно). Вы можете задать свой набор настроек в каждом профиле, а затем переключаться между ними. В старых Delphi есть только один профиль настроек и вам нужно менять каждую настройку вручную.

    Напомним, что при смене любой из опций необходимо сделать полный Build проекту (а не просто Compile).

    Что означают эти опции?

    Самыми важными настройками являются группа опций «Debug information», «Local Symbols» и «Symbol reference info».

    Программа представляет собой набор машинных команд. Текст программы представляет собой текстовый файл. Вопрос: как отладчик узнаёт, когда надо остановиться, если вы поставили бряк на строку в тексте? Где же соответствие между текстовым файлом и набором байт в exe-файле? Вот для такой связи и служит отладочная информация. Это, грубо говоря, набор инструкций типа: «машинные коды с 1056 по 1059 относятся к строке 234 модуля Unit1.pas». Вот с помощью такой информации и работает отладчик. Указанные выше опции отвечают за генерацию отладочной информации для ваших модулей.

    Отладочная информация сохраняется вместе с кодом модуля в dcu-файле. Т.е. один и тот же Unit1.pas может быть скомпилирован как с отладочной информацией, так и без неё — в разные dcu файлы. Отладочная информация увеличивает время компиляции, размер dcu-файлов, но не влияет на размер и скорость работы полученного exe-файла (т.е. отладочная информация не подключается к exe-файлу) (*).

    Бывают ситуации, когда наличие отладочной информации в файле или (хотя бы) рядом с файлом является необходимым. Например, если вы выполняете удалённую отладку или отладку внешнего процесса. Или если вам нужен читаемый стек вызовов в вашем средстве диагностики исключений.

    Подключение отладочной информации к приложению осуществляется несколькими способами: либо это опции проекта (а именно: «Map File», «Debug information» (Linker)/«Include TD32 Debug info» или «Include remote debug symbols»), либо это возможности всевозможных экспертов (типа EurekaLog, JCL или madExcept), которые добавляют отладочную информацию в программу в своём формате.

    Итак, опции отладочной информации:

    • «Debug information» (директива <$D+>или <$D->) – это собственно и есть отладочная информация. Т.е. соответствие между текстом программы и её машинным кодом. Вы должны включить эту опцию, если хотите ставить бряки, выполнять пошаговую отладку, а также иметь стек с именами для своего кода. Часто эту опцию включают автоматически различные эксперты типа EurekaLog.
    • «Local symbols» (директива <$L+>или <$L->) – является дополнением к отладочной информации. Она отвечает за соответствие между данными в exe-файле и именами переменных. Если вы включаете эту опцию, то отладчик позволит вам просматривать и изменять переменные. Также окно «Call Stack» будет способно отражать переданные в процедуры параметры.
    • «Reference info» – это дополнительная информация для редактора кода, которая позволяет ему отображать более подробную информацию об идентификаторах. Например, где была объявлена переменная.

    Эти три опции тесно связаны и обычно нет смысла включать/выключать их по одной.

    • «Use Debug DCUs» — эта опция переключает сборку вашей программы с отладочными модулями Delphi или с обычными. Если вы внимательно посмотрите на установку Delphi, то увидите, что pas файлы из папки Source никогда не используются для компиляции — а только для отладки. Для компиляции же используются уже готовые dcu-файлы из папки Lib. Это уменьшает время компиляции. Поскольку dcu могут быть скомпилированы с отладочной информацией и без неё, то в папке Lib есть два набора dcu-файлов: обычные и отладочные. Переключая эту опцию, вы указываете, какие из них использовать. Если вы выключите эту опцию, то не сможете заходить по F7 в стандартные функции и методы Delphi (т.к. для них будет отсутствовать отладочная информация). Также при выключенной опции вы не будете видеть информацию о стандартном коде в стеке вызовов.
    • «Stack Frames» — эта опция отвечает за генерацию стековых фреймов. Если опция выключена, то стековый фрейм не генерируется без необходимости. Если она включена -то фрейм генерируется всегда. Стековые фреймы используются при построении стека вызовов по фреймам (построение методом raw-сканирование не нуждается в стековых фреймах). В обычном приложении стековые фреймы генерируются практически всегда (**).
    • «Range checking» — служит помощником в поиске проблем при работе, например, с массивами. Если её включить, то для любого кода, который работает с массивами и строками, компилятор добавляет проверочный код, который следит за правильностью индексов. Если при проверке обнаруживается, что вы вылезаете за границы массива, то будет сгенерировано исключение класса ERangeError. При этом вы можете идентифицировать ошибку обычной отладкой. Если же опция выключена, то никакого дополнительного кода в программу не добавляется. Включение опции немного увеличивает размер программы и замедляет её выполнение. Рекомендуется включать эту опцию только в отладочной версии программы.
    • «Overflow checking» — похожа на опцию «Range checking», только проверочный код добавляется для всех арифметических целочисленных операций. Если результат выполнения такой операции выходит за размерность (происходит переполнение результата), то возбуждается исключение класса EIntOverflow. Пример – к байтовой переменной, равной 255, прибавляется 2. Должно получиться 257, но это число больше того, что помещается в байте, поэтому реальный результат будет равен 1. Это и есть переполнение. Эта опция используется редко по трём причинам. Во-первых, самый разный код может рассчитывать на то, что эта опция выключена (часто это различного рода криптографические операции, подсчёт контрольной суммы и т.п., но не только). В связи с этим при включении этой опции могут начаться совершенно различные проблемы. Во-вторых, в обычных ситуациях работают с четырёхбайтовыми знаковыми величинами, и работа около границ диапазонов представления происходит редко. В-третьих, арифметические операции с целыми – достаточно частый код (в отличие от операций с массивами), и добавление дополнительной работы на каждую операцию иногда может быть заметно (в смысле производительности).
    • «I/O Checking» — эта опция используется только при работе с файлами в стиле Паскаля, которые считаются устаревшими. По-хорошему, вы не должны использовать их и, соответственно, эту опцию.

    Замечу также, что эти опции можно выставлять и локально — как для целого модуля, так и для отдельной функции/процедуры (а для некоторых опций — даже для участка кода). Делается это обычными директивами компилятора, узнать которые вы можете, нажав F1 в окне настроек. Например, «Stack Frames» регулируется <$W+>и <$W->.

    Кроме того, помимо настроек компилятора (Compiling) есть ещё настройки компоновщика (Linking):

    • «Map file» — включение опции заставляет линкёр Delphi создавать вместе с проектом map-файл. Различные установки опции отвечают за уровень детализации и обычно имеет смысл ставить только Off или Detailed. Map файл обычно используется всевозможными утилитами типа EurekaLog, JCL или madExcept в качестве первичного источника для создания отладочной информации в своём формате. Поэтому руками устанавливать эту опцию вам придётся крайне редко — эксперты включают её самостоятельно по необходимости.
    • «Debug Information» (Linker)/«Include TD32 debug info» — внедряет в приложение отладочную информацию для внешнего отладчика в формате TD32. Обычно эта опция включается, если вы отлаживаете проект через Attach to process и Delphi не может найти отладочную информацию. При включении этой опции размер самого приложения увеличивается в 5-10 раз (при условии, что опция «Place debug information in separate TDS file» выключена). Поэтому, если вам нужна отладочная информация в распространяемом приложении — лучше рассмотреть другие варианты (лучше всего подходит отладочная информация в специализированных форматах — EurekaLog, JCL, madExcept).
    • «Include remote debug symbols» — заставляет линкёр создать rsm-файл вместе с проектом, в который записывается информация для удалённого отладчика Delphi. Вам нужно включать эту опцию, если вы хотите выполнить удалённую отладку. Полученный rsm-файлик нужно копировать вместе с приложением на удалённую машину.

    Всю эту информацию можно просуммировать и дать рекомендации по установке опций для различных случаев жизни. Они приведены ниже. Жирным выделены настройки, отличающиеся от умалчиваемых (т.е. на них нужно обратить внимание и выставить вручную).

    Хочу заметить, что помимо опций Delphi, в самих экспертах/инструментах также могут быть настройки, влияющие на детальность отладочной информации. Например, обзор таких настроек для EurekaLog мы уже делали в этой статье.

    Обычное приложение без механизма диагностики исключений

    Общие настройки для любых профилей

    Все опции отладки («Debug information» (Compiler), «Local symbols», «Reference info») вообще на готовый модуль не влияют, т.к. отладочная информация в exe/DLL не хранится, ну и нам жить не мешают => поэтому смысла их выключать я не вижу («Use Debug DCUs» — устанавливайте по вкусу, смотря по тому, хотите вы отлаживаться в стандартных модулях или нет).

    «Stack Frames» вообще включать незачем.

    Генерацию map-файла выключаем.

    Профиль Debug

    Включаем «Range checking» и (по вкусу) «Overflow checking».

    «Include TD32 debug info» — включаем только для отладки внешнего процесса.

    Соответственно, «Include remote debug info» — включаем только для удалённой отладки.

    Профиль Release

    Выключаем «Range checking», «Overflow checking», «Include TD32 debug info» и «Include remote debug info».

    Приложение с механизмом диагностики исключений (типа EurekaLog, JCL или madExcept)

    Общие настройки любых профилей

    Все опции отладки («Debug information» (Compiler), «Local symbols», «Reference info») держать включёнными, т.к. в противном случае не будет доступна отладочная информация. Соответственно, ваши информационные механизмы пойдут лесом.

    «Stack Frames» — вообще вЫключать незачем.

    Генерацию map-файла включаем, если об этом не позаботился эксперт (маловероятно).

    Профиль Debug

    «Use Debug DCUs» — по вкусу.
    Включаем «Range checking» и (по вкусу) «Overflow checking».

    «Include TD32 debug info» — включаем только для отладки внешнего процесса.

    «Include remote debug info» — включаем только для удалённой отладки.

    Профиль Release

    Включаем «Use Debug DCUs».

    Выключаем «Range checking», «Overflow checking», «Include TD32 debug info» и «Include remote debug info».

    Примечание: если вы используете мало операций с индексами в своей программе (так что дополнительные проверки не замедлят её), то будет хорошей идеей всегда держать опцию «Range checking» включённой.

    Что может пойти не так, если настройки будут заданы неверно?

    Ну, во-первых, это невозможность отладки (например, отсутствие информации для удалённого отладчика или выключенная опция «Debug information» (Compiler)), большой размер приложения (например, случайно забыли выключить «Debug information» (Linker)/«Include TD32 debug info»), медленная работа (например, компиляция с отладочным кодом), отсутствие или неполный стек вызовов в средствах диагностики исключений (например, выключили «Debug information» (Compiler)). В очень редких и запущенных случаях переключение опций может сказаться на работоспособности программы (например, установка Stack frames может снизить максимально возможную глубину рекурсии). Ну и недочёты по мелочи.

    Кстати, если вы разрабатываете компоненты, то надо учитывать, что у Delphi есть именно два набора DCU-файлов, которые отличаются настройками компиляции. Вообще говоря, простое переключение опций, ответственных за генерацию отладочной информации, никак не влияет на интерфейс и реализацию модуля. Но в общем случае код может использовать условные директивы. Поэтому может быть ситуация, когда два набора DCU файлов (скомпилированных с разными опциями) не совместимы друг с другом — потому что они использовали какую-либо директиву и содержат разный код (а вот и пример).
    Поэтому вам тоже надо иметь два набора DCU-файлов: один — скомпилированный с опцией «Use Debug DCUs», другой — без. Причём, не важно включена или выключена опция «Debug information» (Compiler) в ваших настройках в обоих случаях.

    Примечания:
    (*) Слова «отладочная информация увеличивает время компиляции, размер dcu-файлов, но не влияет на размер и скорость работы полученного exe-файла» некоторые понимают неправильно. В частности, многие замечают, что если переключить профиль приложения с Debug на Release (или наоборот), то размер приложения изменится (незначительно или же намного — зависит от настроек проекта и его исходного кода). Позвольте, но ведь я говорю об отладочной информации в чистом виде (мы говорим про опции «Debug Information», «Local Symbols» и т.п. с вкладки «Compiling»), а вы меняете профиль компиляции целиком. Это не только смена опций отладочной информации (которые, кстати, могут даже вообще не меняться при смене профиля), а также и множество других настроек.

    Например, в вашем коде может быть тьма конструкций вида <$IFDEF DEBUG>какой-то код <$ENDIF>. Разумеется, когда вы собираете программу в Release, этот код в программу не попадёт, а когда вы собираете его в Debug, то — попадёт. Потому что по умолчанию профиль Debug содержит символ условной компиляции «DEBUG». В результате размер .exe действительно получится разный. Но повлияла ли на этот размер отладочная информация? Неа. Фактически, вы собрали в разных профилях разных код — неудивительно, что он разный по размеру.

    Более того, вы можете удалить из конфигурации Debug символ условной компиляции «DEBUG» — и тогда вы будете собирать один и тот же код в обоих профилях. Ну, по крайней мере, свой код. Сторонний, уже собранный код, конечно же, никак не будет затронут. Например, код RTL/VCL уже скомпилирован с фиксированными настройками и не меняется при пересборке проекта. Вон там чуть выше я упомянул, что в некоторых версиях Delphi отладочный и релизный варианты кода RTL/VCL незначительно отличаются — опять же, благодаря условной компиляции. Но никак не отладочной информации.

    Кроме того, к иному коду приводит и включение/выключение опций вида Optimization, Stack Frames, Range Check Errors и др. Действительно, оптимизация может удалять код (оптимизировать ненужный) или увеличивать (вставлять inline вместо вызова), Stack Frames очевидно добавляет код (код установки фрейма), равно как и Range Check Errors (код проверки диапазонов). В результате, вы меняете профиль — вы меняете и код (при условии, что разные профили имеют разные настройки вышеупомянутых опций — что так и есть по умолчанию). Меняете код — меняете и размер. Имеет ли хоть какое-то отношение к этому изменению размера отладочная информация? Нет.

    Далее, другой пример. Несмотря на то, что по умолчанию отладочная информация в .exe файл не попадает — никто же не запрещает её вам туда добавить самому! Например, если вы будете использовать трейсер исключений, то он самостоятельно добавит в .exe часть отладочной информации, которая нужна ему для построения читабельных стеков вызовов.

    Также о внедрении отладочной информации можно попросить и среду. Например, вы можете включить «Include TD32 Debug Info» (эта опция называется «Debug Information» на вкладке «Linking» в последних версиях Delphi) и выключить опцию «Place debug information in separate TDS file». Тогда вся отладочная информация из .dcu файлов будет собрана в один большой файл и этот файл будет внедрён в .exe. Тогда да, отладочная информация повлияет на размер файла, но это происходит не из-за её свойств, а потому что мы явно попросили такое поведение: «добавьте отладочную инфу в мою программу».

    Кстати говоря, в последних версиях Delphi здорово поменяли настройки профилей компиляции. Если раньше Release и Debug мало чем отличались, то теперь отличия существенны. Профиль Debug выключает Optimization, но включает Stack Frames (а профиль Release — делает наоборот). Профиль Debug включает отладочную информацию, а Release — отключает. Но оба профиля включают Assert-ы. Также оба профиля включают I/O checks, но выключают overflow и range. В настройках компоновщика (linking) профиль Debug включает TD32 («Debug information») и Remote debug symbols (не для всех платформ). Release, соответственно, выключает эти же опции. И оба профиля не включают Map file и отдельный файл для TD32.

    (**) Например: Button1Click состоит всего из двух инструкций: «call A; ret;». Она очень короткая и не использует аргументы или локальные переменные. Поэтому, очевидно, что ей не нужен стековый фрейм. Когда опция «Stack frames» выключена, то для Button1Click стековый фрейм не создаётся (но он создаётся, если опция «Stack frames» будет включена).

    Но, для более сложных процедур стековые фреймы будут генерироваться вне зависимости от установки опции «Stack frames».

    Например, тоже очень короткая процедура B всегда имеет фрейм. Причина: использование типа String в ShowMessage. Компилятору нужно вставить неявную строковую переменную и неявный try/finally для её освобождения, поэтому процедуре нужен фрейм.

    В реальных приложениях фреймы генерируются для 99% процедур. Подробнее: Фреймы на стеке.

    Источник

    0 / 0 / 0

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

    Сообщений: 134

    1

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


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

    __________________
    Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



    0



    LK

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

    18.12.2011, 16:57

    2

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

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

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

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



    0



    1363 / 730 / 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



    1363 / 730 / 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

    247 / 89 / 17

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

    Сообщений: 413

    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



    Умея
    пользоваться массивами, условными
    операторами и операторами цикла, вы
    можете писать довольно серьезные
    программы. При выполнении этих программ
    неизбежно будут возникать критические
    ошибки, приводящие к аварийному завершению
    программы. Такие ошибки по английски
    называются 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+}
    — это поможет вам найти и устранить все
    ошибки. Некоторые неопытные программисты
    выключают эти опции, тогда программа
    не прерывается при некоторых ошибках,
    а продолжает выполняться, на этом
    основании делается вывод, что программа
    верна. Это самообман — программа
    выполняется, но выполняется неправильно
    и никак не сообщает об ошибках.

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

    • #
    • #

    Содержание

    1. Range check error что за ошибка как исправить
    2. Ошибка Range check error
    3. #1 mikpav
    4. #2 mikpav
    5. #3 admin
    6. #4 Матрос
    7. #5 Лена
    8. Прикрепленные файлы
    9. #6 Матрос
    10. Range check error что за ошибка как исправить

    Range check error что за ошибка как исправить

    есть FTP клиент , получает спісок файлов з определьонной папки на фтп и сравнивает из локальной папкой , через некоторое время появляетса ошибка range check error, после перегрузки опять работает некоторое время и снова ошибка , откуда она .


    wal © ( 2005-09-01 11:06 ) [1]

    Где-то вылез за пределы диапазона. Например

    var a: array[0..9]of SameType;
    begin
    a[10]:= .
    end


    integery ( 2005-09-01 11:27 ) [2]

    а как можно узнать где именно вилезло.


    Плохиш © ( 2005-09-01 11:32 ) [3]


    > integery (01.09.05 11:27) [2]
    > а как можно узнать где именно вилезло.

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


    integery ( 2005-09-01 11:38 ) [4]

    я серйозно, проблема в том што ошибка то есть то нет щас уже раз так 20 запускаю и нет ошибки , а через некоторое врямя опять.

    В сообщении об ошибке, обычно, ещё и адрес указывается.


    Германн © ( 2005-09-03 18:06 ) [6]

    2 Плохиш © (01.09.05 11:42) [5]


    Anatoly Podgoretsky © ( 2005-09-03 18:46 ) [7]

    Легче избежать ошибки, чем бороться.
    При работе в сети списки это динамическая вещь, а если есть потоки то ситуация усугубляется.


    Германн © ( 2005-09-04 01:16 ) [8]

    2 Anatoly Podgoretsky © (03.09.05 18:46) [7]
    Вы как всегда правы.
    Ну а если вдруг Ваш совет опоздал? И проект уже так разросся, что проглядеть исхдники на RangeCheck/B> уже НУ ОЧЕНЬ УТОМИТЕЛЬНО!
    Если Вы знаете как упростить сей поиск, сообщите pleese!


    Германн © ( 2005-09-04 01:38 ) [9]

    Кстати, по-моему, сей вопрос явно шире, чем рамки этой конференции. Может ли кто объяснить мне особое отношение Борланда к этой ошибке!
    Почему «проверку на выход из диапазона» можно влючить/выключить Я еще как-то могу понять. (Хотя это уже «дела давно минувших дней»). Но вот почему при включенной опции RangeCheck в сообщении об ошибке нет адреса, где она произошла — понять не могу.

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


    Германн © ( 2005-09-05 03:29 ) [11]

    2 Anatoly Podgoretsky © (04.09.05 08:36) [10]
    Разве?

    Конечно мой опыт в Делфи — гораздо меньший, чем у Вас! Но неужели я умудрился за десяток лет не получить ни одной ошибки без адреса, кроме RangeCheckError. 🙁
    Имхо это значит, что я ОЧЕНЬ отстал от Делфи. 🙁

    Источник

    Ошибка Range check error

    #1 mikpav

  • Пользователи
  • 5 сообщений
    • Город: г. Санкт-Петербург

    #2 mikpav

  • Пользователи
  • 5 сообщений
    • Город: г. Санкт-Петербург

    #3 admin

  • Главные администраторы
  • 312 сообщений
    • Пол: Мужчина
    • Город: ПОТОК

    mikpav (29.5.2009, 10:53) писал:

    #4 Матрос

  • Администраторы
  • 940 сообщений
    • Пол: Мужчина
    • Город: Поток

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

    Накопитель подобных «казусов» при подачи данных постоянно пополняется после анализа присланных примеров.

    Вот результаты расчета одной из присланных для анализа систем:-
    В системе есть стояки из одного прибора (22 шт!).
    Нагрузка на отопительный прибор иногда 13 ватт или 30 ватт, или 40 ватт.

    О чём же думает конструктор глядя на свою схему? Как он уверенно обвиняет ПОТОК в отвратительной работе — не считает! Затыкается! Обманули, деньгу содрали за просто так!
    Подсунули вот Вам туфту — «сырую поделку» за деньги. Да ещё она, эта поделка, » ругается на иностранном языке«.
    Обращается к руководству фирму и директор подписывает письмо-рекламацию в адрес руководства ЗАО ПОТОК:

    Срочно приходится реабилитироваться. Извиняться. Обязуемся вставить доп. контроль в программу — «сито/подстраховку» на «некорректную подачу данных».
    И нелогично же отвечать директору «прямым текстом». Этика. Писать надо «витиевато» = виноват, исправлюсь.

    #5 Лена

  • Пользователи
  • 2 сообщений
  • Прикрепленные файлы

    #6 Матрос

  • Администраторы
  • 940 сообщений
    • Пол: Мужчина
    • Город: Поток

    Лена (10 Сентябрь 2013 — 17:13) писал:

    Зачем Вы так написали в таблице магистрали?

    3 0 4 100 .
    -4 0 -3 101 .

    надо бы во второй строке 4 и 3 писать без знака, а 101 указать с минусом. Так рекомендовано формировать данные в Инструкцию пользователю программы ПОТОК. Но Вы Инструкции игнорируете. Кто Вам порекомендовал указать «-4» и «-3» ?
    Данные подаете как попало, как в ум взбредёт, потом ругаете и программу и костерите авторов. :fool:/>

    У Вас всего две ветки и у них автоматически межветочные магистрали симметричны по нагрузке. Но Вы во второй строке ветки обозначили со знаком «-«. Так не предусмотрено нынче в однотрубном исполнении — так (знаком «-«) обозначались раньше пред включенные стояки лестничных клеток.
    Если системы несимметричные по нагрузке в межветочных трубах, то согласно «Руководства пользователю ПОТОК», вначале описывается подающая часть от ТП — «встать» на трубу и последовательно описать все сборные участки до веток. Затем обратная записывается часть по направлению к ТП.
    Таким образом, первый подающий сборный участок и последний обратный будут иметь нагрузку всей системы.
    Первый сборный участок трубы обратного теплопровода помечается разделителем, знаком «-«.

    Все — больше никаких «минусов» в таблице быть не должно.

    Вынуждены внести в программу доп_контроль данных:

    Источник

    Range check error что за ошибка как исправить

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

    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

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

    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.

    > 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

    > San1712 (01.12.07 06:58)

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

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

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

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

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

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

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

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

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

    Источник

    ошибка

    Что обозначает ошибка 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)???

    After spending a week checking and fixing my program for memory leaks through FastMM4, I finally test ran my program on a different PC. Now, I am getting «Range Check Error.» I have spent hours researching online about this, but none of them seem to give me what I am looking for. My program was complied with the Runtime Error option Range Check. So, I know that’s why I am getting the error, but I needed to know exactly why the error is raised.

    The program was compiled on XP with Delphi 7.0. The testing PC is a Windows 7. As soon as it starts up, my program begins to communicate through serial port and then followed by «Range Check Error» message boxes. When I stop the serial communication, there are no «Range Check Error» boxes. What does this mean and how do I go about resolving it? I am looking for simple strategy. I know I could spend days checking line by line.

    «Range Check Error» caused by improper assignment of values or accessing inaccessible index of an array. Am I correct?

    asked Mar 28, 2011 at 16:11

    ThN's user avatar

    3

    Your understanding of range check errors is correct. They arise when you access an array outside it’s bounds. For example:

    type
      TFixedArray = array [0..41] of Integer;
    var
      a: TFixedArray;
    begin
      a[42] := 1+2;//!! this is a range check error !!
    end;
    

    Or for a dynamic array:

    var
      a: array of Integer;
    begin
      SetLength(a, 666);
      a[665] := 12;//this is fine
      a[666] := 42;//!! this is a range check error !!
    end;
    

    I’ve illustrated this with assignment, but reading an array with an index out of bounds will also produce a range error.

    The range error should report an address at which it occurs which you can then translate into a code location with your map file. Even better would be if you were using madExcept or some such tool.


    UPDATE

    Prompted by Ken, the documentation states what is affected by the range checking option as follows:

    In the {$R+} state, all array and
    string-indexing expressions are
    verified as being within the defined
    bounds, and all assignments to scalar
    and subrange variables are checked to
    be within range.

    answered Mar 28, 2011 at 16:15

    David Heffernan's user avatar

    David HeffernanDavid Heffernan

    596k42 gold badges1055 silver badges1471 bronze badges

    6

    Having read other information about the concept of «range check error», I believe that the reason for causing the «range check error» in this scenerio is that:
    the variable assigning to access the serial port the program reads is an 16-bytes(or smaller) type, and the serial port the program reads exceeds the limitation of the variable.
    Notice that [When I stop the serial communication, there are no «Range Check Error» boxes.], this should make all things clear.

    answered Oct 27, 2017 at 8:00

    Edward's user avatar

    Понравилась статья? Поделить с друзьями:
  • Что такое presentation error
  • Что такое историческая ошибка
  • Что такое интернет error
  • Что такое play error
  • Что такое игровая ошибка