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% процедур. Подробнее: Фреймы на стеке.

    Источник

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

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

    • #
    • #

    ошибка

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

     
    integery
     
    (2005-09-01 11:04)
    [0]

    есть 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-01 11:42)
    [5]

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


     
    Германн ©
     
    (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 в сообщении об ошибке нет адреса, где она произошла — понять не могу.


     
    Anatoly Podgoretsky ©
     
    (2005-09-04 08:36)
    [10]

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


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

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

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


    Понравилась статья? Поделить с друзьями:
  • Range check error ошибка
  • Range check error мультитроникс
  • Range check error как исправить ошибку
  • Range check error как исправить fn run
  • Range check error w7lxe