Что такое ошибка времени выполнения паскаль

Неописанная переменная

begin
  S := 1; // Неизвестное имя S
end.

Все используемые переменные должны быть предварительно описаны с помощью ключевого слова var (внутри блока begin/end или, что обычно хуже, в разделе описаний вначале программы).

Отсутствующая ;

begin
  var S: integer 
  S := 1;         // Компилятор здесь скажет: Ожидалась ; — имеется ввиду предыдущая строка!
end.
begin
  var S := 1 
  S := S + 1  // Аналогично: проблема на предыдущей строке, а на текущей нет, потому что после неё идёт end.
end.

Очень частая ошибка у начинающих. Курсор, как правило, позиционируется в начале следующей строки.

Несовместимость типов при присваивании

begin
  var S: integer := 1.3; // Нельзя преобразовать тип real к integer
end.

Безболезненно можно присваивать только данные одного типа. Если данные — разных типов, то в редких случаях можно преобразовать данные одного типа в данные другого. Например, целое можно преобразовать в вещественное, а символ — в строку. Обратные преобразования не допускаются.

Чтобы не ошибаться в подобных простых случаях в Паскале есть следующая краткая форма объявления и инициализации переменной:

begin
  var S := 1.3; // Тип real будет выведен компилятором автоматически
end.

Отсутствие закрывающего апострофа литеральной строки

begin
  var x := 2;   // x получает тип integer
  var y := 3;   // y получает тип integer
  writeln('Результат сложения равен =, x + y); // Не хватает закрывающего апострофа
end.

Закрыть апостроф надо на той же строке, где расположен открывающий апостроф

Ошибки расстановки запятых и апострофов при выводе строк и выражений

begin
  var x := 2;   // x получает тип integer
  var y := 3;   // y получает тип integer
  writeln(x, '+,' y, '=', x+y); // Неверная расстановка запятых и апострофов
end.

Слишком много запятых и апострофов рядом, потому начинающие часто путаются  :)
Надо уяснить правила:

  • запятые разделяют разные элементы вывода
  • все, что находится в апострофах, будет выведено на экран без изменений

Ошибка ввода

begin
  var x: integer;
  read(x); // введите блаблабла и посмотрите, что получится
end.

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

Аналогичный фрагмент в более современном и предпочтительном синтаксисе:

begin
  var x := ReadInteger;
end.

Ошибка неинициализированной переменной

begin
  var x: integer;
  // Забыли инициализировать или ввести x
  var r := x * x;  // r получает тип integer
  writeln('Квадрат числа ', x, ' = ', r);
end.

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

Деление на 0

begin
  var x := 0;
  var c := 666 div x; // Здесь происходит деление на 0
end.

Если во время выполнения программа выполнит деление на 0, то она завершится с ошибкой.

Корень из отрицательного числа

begin
  writeln(sqrt(-1)); // Корень из отрицательного числа 
end.

В обычном Паскале возникает ошибка времени выполнения.
В PascalABC.NET выводится NaN — Not a Number

Ссылки

  • Программы для начинающих
  • Сайт PascalABC.NET: Программы и алгоритмы для начинающих

В программе работает все, кроме удаления записи из файла

Собственно сама ошибка:

строка (254) : Ошибка времени выполнения: Входная строка имела неверный формат.

В строке 254 находится (readln(menu);)

  program Telophonia;

type
  abonent = record
    number:   string[10];                //Номер телефона
    FIO:      string[40];                //ФИО абонента
    adres: record               //Адрес абонента в виде другой записи состоящий из:
    street: string[20];                            //Улица
    house:  string[20];                            //Дом
    flat:   string[20];                            //Квартира
    end;
    date:     string[10];                   //Дата подключения абонента
  end;

var
  abonents: file of abonent;             //Файл содержащий записи об абонентах
  x, t: abonent;                        //Вспомогательная переменная типа записи об абонентах
  menu, ind, cnt: integer;              //Вспомогательные переменные для меню, индексации и счетчика записей в некоторых процедурах
  yn: char;                             //Переменная y/n ответов
  filename: string[25];                 //Имя файла, задаваемое пользователем
  nmbr: string[10];                     //Вспомогательная переменная для номера абонента


//Процедура удаления записи из файла
procedure del(a: file of abonent);
label nachalo,ex;//метка начала и конца процедуры
begin
  nachalo:     //метка начала процедуры
  reset(a);
  write('Введите номер:');
  read(nmbr);
  cnt := 0;       //ведем счет записей из файла, чтобы в дальнейшем обратиться к нужной считанной записи и удалить ее
  repeat     //просматривать файл на совпадение номера абонента
    if eof(a) then    //если дошли до конца и не нашли нужного абонента
    begin
      writeln('Абонента с таким номером не существует!');
      write('Найти по другому номеру? (y/n):');
      readln(yn);
      if yn = 'y' then goto nachalo else goto ex;
    end;
    read(a, t);     //чтение записи из файла
    cnt := cnt + 1;   //увеличиваем счетчик записей на один
  until t.number = nmbr;
  writeln('Найденный абонент:');
  writeln(t.number, ' ', t.FIO, ' ', t.adres.street, ' ', t.adres.house, ' ', t.adres.flat, ' ', t.date);
  writeln;
  writeln('Удалить данные об абоненте? (y/n):');
  readln(yn);
  if yn <> 'y' then goto ex;
  cnt := cnt - 1;
  while not eof(a) do
  begin
    if filesize(a)=cnt+1 then break;
    seek(a, cnt+1); //перевод указателя на следующий элемент
    read(a, t);
    seek(a, cnt);    //перевод указателя на удаляемого абонента
    write(a, t);      //перезапись следующего абонента из файла на место удаляемого
    cnt := cnt + 1;
    seek(a, cnt);   //перевод указателя на следующую за переписанным абонентом
  end;
  seek(a, filesize(a) - 1);   //перевод указателя на последнюю запись в файле
  truncate(a);  //удаление последней записи в файле
  writeln('Данные удалены');
  write('Найти по другому номеру? (y/n):');
  readln(yn);
  if yn = 'y' then goto nachalo;
  ex:    //метка выхода из процедуры
  close(a);
end;

   //Процедура корректировки записи в файле
procedure edit(a: file of abonent);
label nachalo,ex;//метки начала процедуры и выхода из нее
begin
  reset(a);
  nachalo:     //метка начала процедуры
  write('Введите номер абонента:');
  read(nmbr);
  cnt := 0;       //ведем счет записей из файла, чтобы в дальнейшем обратиться к нужной считанной записи и перезаписать ее
  yn:='n';
  while not eof(a) do
  begin
    read(a, t);     //чтение записи из файла
    cnt:= cnt + 1;   //увеличиваем счетчик записей на один
    if t.number = nmbr then break;
  end;
  if eof(a) then    //если дошли до конца и не нашли нужного абонента
  begin
       writeln('Абонента с таким номером не существует!');
       write('Найти по другому номеру? (y/n):');
       readln(yn);
       if yn = 'y' then goto nachalo else goto ex;
  end;
  cnt := cnt - 1;   //возвращаемся к предыдущей записи, чтобы ее изменить
  writeln('Изменить данные об абоненте? (y/n):');
  readln(yn);
  readln(yn);
  if yn <> 'y' then goto ex;
  with x do
  begin
    repeat    //просматривать файл на совпадение номера абонента
      write('Номер абонента = ');
      readln(number);
      reset(a);
      while not eof(a) do
      begin
        read(a, t);    //чтение записи из файла
        if t.number = number then
        begin
          writeln('Абонент с таким номером уже существует!');
          break;        //выходим из цикла while и повторяем сначала
        end;
      end;
    until t.number <> number;
    write('ФИО = ');
    readln(FIO);
    write('Улица = ');
    readln(adres.street);
    write('Дом = ');
    readln(adres.house);
    write('Квартира = ');
    readln(adres.flat);
    write('Дата подключения = ');
    readln(date);
    writeln;
  end;
  writeln('Изменить данные об абоненте? (y/n):');
  readln(yn);
  readln(yn);
  if yn <> 'y' then goto ex;
  seek(a, cnt);
  write(a, x);  //запись переменной в файл
  writeln('Изменения приняты.');
  WriteLn;
  writeln('Найти по другому номеру? (y/n):');
  readln(yn);
  if yn = 'y' then goto nachalo;
  ex:    //метка выхода из процедуры
  close(a);
end;
//Процедура вывода содержимого файла на экран
procedure find(a: file of abonent);
label nachalo;
begin
     nachalo:
     with x do
     begin
          write('Номер абонента = ');
          readln(number);
          reset(a);
          cnt := 0;   //ведем счет удовлетворяющих запросу записей
          while not eof(a) do
           begin
                read(a, t);    //чтение записи из файла
                if t.number = number then
                begin
                     writeln('Найдено:');
                     writeln(number, ' ', FIO, ' ', adres.street, ' ', adres.house, ' ', adres.flat, ' ', date);
                     cnt := cnt + 1;
                     break;
                end;
           end;
      end;
  if cnt=0 then writeln('Не найдено абонента с таким номером.');
  writeln;
  writeln('Найти по другому номеру? (y/n):');
  readln(yn);
  if yn = 'y' then goto nachalo;
  close(a);
end;



begin
  write('Введите имя файла: ');
  readln(filename);
  assign(abonents, filename);
  repeat
    writeln('1: Вывести содержимое');
    writeln('2: Добавить абонента');
    writeln('3: Удалить абонента');
    writeln('4: Изменить данные абонента');
    writeln('5: Найти по номеру');
    writeln('0: Выход');
    write('Выберите действие: ');
    readln(menu);
    writeln;
    case menu of
      1: show(abonents);
      2: add(abonents);
      3: del(abonents);
      4: edit(abonents);
      5: find(abonents);
    end;
  until menu = 0;
end.

Если вы столкнулись с ошибкой обучения 005 паскалей на своем ПК, какой пост в блоге должен помочь вам исправить это.

Ускорьте свой ПК всего за несколько кликов

  • 1. Скачайте и установите ASR Pro
  • 2. Откройте приложение и нажмите кнопку «Сканировать».
  • 3. Выберите файлы или папки, которые вы хотите восстановить, и нажмите кнопку «Восстановить».
  • Загрузите это программное обеспечение сейчас и попрощайтесь с проблемами вашего компьютера. г.

    Приложения, скомпилированные с помощью Free Pascal, могут генерировать ошибки времени выполнения в любое время, когда вы уверены, что внутри приложения встречаются ненормальные среды. В этом приложении перечислены вероятные проблемы с производительностью и представлена ​​информация о том, почему эти люди могут быть привлечены к работе. 1 Неверный номер должности.

    <таблица readabilitydatatable = «1»>

    <тд>

    <тд> <тд>

    Время указано в формате UTC

    <случаи>

    Вычислить ошибку выполнения 005

    <таблица readabilitydatatable = «1»>

    Г. Г-н Сталин
    номер 1/4

    <тд>

    Что означает пример ошибки времени выполнения?

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

    Ошибка выполнения 005

    Здравствуйте!

    Может ли конкретный человек дать мне новое описание ошибки времени выполнения 005 (info
    0000: 0277). Эта ошибка возникает, когда я запускаю программное обеспечение DOS, доступное для Win ’95 и
    , даже когда я второй раз запускаю программное обеспечение DOS под Win NT.

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

    ошибка выполнения 005 паскаль

    Спасибо,

    Харви

    <тд>

    Тимо Сал
    # 2/4

    <тд>

    Ошибка выполнения 005

    <р> Если возможно, дайте мне хороший список описаний всех этих веб-страниц с ошибками, или
    : скажите мне, где я могу попытаться получить такой последний список.

    Транспорт защищен

    33)
    Какая отличная ошибка, например ошибка чтения first thererrrs 205 и т.д.

    149061 19 июля 1998 г. ftp: //garbo.uwasa.fi/pc/link/tsfaqp.zip
    tsfaqp.zip Часто задаваемые вопросы, касающиеся опций Turbo Pascal и Timo, подключенных к

    Всем как лучше,
    timo

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

    <тд>

    <тд>

    Роммерт Дж. Казими
    № 3-4

    <тд>

    Вычислить ошибку выполнения 005

    Цитата:

    > Ну откуда! Привет

    > Кто-нибудь может дать описание ошибки чтения в решении 005 (адрес действительно
    > 0000:0277). Эта ошибка возникает, когда я дополнительно запускаю инструменты DOS под Win ’95 и
    > когда запускаю программу DOS под Win NT. Время

    Ошибка выполнения 5: Доступ к файлу запрещен. Это происходит, когда файл уже проверяется другой школой, например, когда он снова проверяется в Excel.
    Однако при ошибке Turbo-7 150 запись на диск выполняется

    Цитата:

    runtime down 005 pascal

    > Если вы, скорее всего, подскажете мне все из довольно большого количества описаний ошибок, то пусть
    > угадает, откуда я мог взять такую ​​базу данных.

    Контактный документ является справочной функцией почти версии Borland Pascal, обнаруживает
    ошибки, запускается, как только пользователь нажимает Shift F1. Если вы не являетесь пользователем Pascal
    , обратитесь к поставщику программного обеспечения. Если за надежным программистом нельзя следить, зачем вообще доверять новой программе?


    Rommert J. Casimir
    Тилбургский университет, B435, тел. 31 12 4662016
    PO Box 90153, 5000LE Тилбург, Нидерланды
    http: // cwis .kub .nl ~ несколько / несколько / BIKA / rc_home.htm

    <тд>

    <тд>

    боюсь шало №4 или четыре

    <тд>

    Ошибка выполнения в программном обеспечении 005

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

    Ошибка воспроизведения может быть связана с каждой проблемой программного или аппаратного обеспечения, которая обычно больше всего мешает Internet Ex правильно обучать plorer. Ошибки времени выполнения могут быть вызваны вашим веб-сайтом с использованием HTML, который будет несовместим с возможностями вашего веб-браузера.

    Цитата:

    <р> Всем привет!

    > Может ли кто-нибудь дать мне описание для практической ошибки 005 (почти наверняка домашняя
    > 0000:0277). Эта ошибка возникает, когда вы решаете, что я запускаю программу DOS младше Win ’95 и
    > в свободное время, когда я запускаю любой план DOS под Win NT.

    Как определить ошибку выполнения?

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

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

    > Спасибо,

    если вы подразумеваете, что исполняемые файлы написаны на Пасху < br> Пользователь может получить полный формат, используя сообщения об ошибках в некоторых меню
    Помощь | Ошибки выполнения

    . Перезвони

    <тд>

    <таблица readabilitydatatable равна «0»>

    Автор Сообщение
    Среда, 18 июня 1902 г., 08:00:00 по Гринвичу
    Среда, 18 июня 1902 г., 08:00:00 по Гринвичу
    Ced, 18 июня 1902 г., 08:00:00 по Гринвичу
    Среда, 16 июня 1902 г., 08:00:00 по Гринвичу
    Страница 1 из 9

    Загрузите это программное обеспечение сейчас и попрощайтесь с проблемами вашего компьютера. г.

    Runtime Error 005 Pascal
    Error De Ejecucion 005 Pascal
    Runtime Fout 005 Pascal
    Erreur D Execution 005 Pascal
    Runtime Error 005 Pascal
    Blad Wykonania 005 Pascal
    Erro De Tempo De Execucao 005 Pascal
    런타임 오류 005 파스칼
    Laufzeitfehler 005 Pascal
    Errore Di Runtime 005 Pascal
    г.

    John Davis

    John Davis

    Related posts:

    Решения ошибок времени выполнения 5 Ошибка доступа к файлу пути

    Решение библиотеки времени выполнения Directx для Windows 7

    Отладка и отладка сильной системы времени выполнения Objective-C

    Помогите разрешить ошибку времени выполнения Myphoneexplorer в решении 372

    • Jak Rozwiązywać Problemy Z Konfiguracją Serwerów Proxy W Systemie Windows Server R2
    • Geen Tips Om Win98-besturingssysteem Te Repareren Gevonden

    <тд> <случаи> <тд> <тд>

    Введение.

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

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

    Особенно
    важно то, что Turbo Pascal имеет мощный и
    гибкий отладчик исходного уровня,
    который позволяет пользователю выполнять
    программу построчно, просматривать
    выражения и модифицировать переменные
    по мере необходимости. Отладчик встроен
    в интегрированную среду разработки
    (IDE) Turbo Pascal; пользователь может
    редактировать, компилировать и отлаживать
    программу даже не выходя из Turbo Pascal. Для
    больших или сложных программ, которые
    требуют использования всего диапазона
    средств отладки от машинного языка до
    вычисления выражений Паскаля, Turbo Pascal
    полностью поддерживает автономный
    отладчик фирмы Borland, Turbo Debugger.

    Типы
    ошибок.

    Существует
    три основных типа программных ошибок:
    ошибки времени компиляции, ошибки
    времени выполнения и логические ошибки.

    Ошибки
    компиляции.

    Ошибки
    компиляции или синтаксические ошибки
    встречаются, когда забывают объявить
    переменную, передают ошибочное количество
    параметров процедуры, при назначении
    действительного значения целочисленной
    переменной. Это означает, что записываются
    операторы, которые не согласуются с
    правилами Паскаля.

    Turbo
    Pascal не закончит процесс компиляции
    программы пользователя (генерацию
    машинного кода), пока все синтаксические
    ошибки не будут удалены. Если Turbo Pascal
    обнаружит синтаксическую ошибку во
    время компиляции программы, он
    останавливает компиляцию, входит в
    исходный текст, указывает местоположение
    ошибки позиционированием курсора и
    выводит сообщение об ошибке в окно Edit.
    Как только пользователь исправит ошибку,
    он сможет начать процесс компиляции
    снова.

    Если
    используется версия командной строки
    (TPC.EXE), Turbo Pascal будет выводить ошибочный
    оператор, номер строки и сообщение об
    ошибке. Затем пользователь может войти
    в любой используемый им редактор, найти
    заданную строку, исправить ошибку и
    перекомпилировать программу. Для
    дополнительной информации о сообщениях
    об ошибках см. Приложение А в Руководстве
    программиста.

    Ошибки
    времени выполнения.

    Другой
    тип ошибок — ошибки времени выполнения
    программы или семантические ошибки.
    Они встречаются, когда пользователь
    компилирует синтаксически корректную
    программу, которая пытается сделать
    что-нибудь запрещенное во время ее
    выполнения, например, открывает
    несуществующий файл для ввода или
    производит деление на 0. В этом случае
    Turbo Pascal выводит на экран следующее
    сообщение об ошибке: Runtime error ## at seg:ofs
    (Ошибка выполнения # в сегменте:смещение)
    и останавливает выполнение программы
    пользователя.

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

    Если
    пользователь выполняет программу в
    среде MS-DOS, он будет возвращаться в
    MS-DOS. Пользователь может загрузить модуль
    TURBO.EXE и использовать опции Search/Find error
    для локализации позиции ошибки в исходной
    программе (убедитесь, что опция Destination
    установлена в Disk). Для обнаружения ошибки
    пользователь может также использовать
    и опцию /F для компилятора командной
    строки (TPC.EXE).

    (Более
    полное объяснение опций командной
    строки TPC.EXE приведено в главе 9 «Компилятор
    командной строки».)

    Логические
    ошибки.

    Программа
    пользователя может содержать и логические
    ошибки. Это означает, что программа
    делает то, что ей указали вместо того,
    что хотелось бы. Может отсутствовать
    инициализация переменной; могут оказаться
    ошибочными вычисления; рисунки,
    изображенные на экране, выглядят
    неправильно; программа может просто
    работать не так, как было задумано. Такие
    ошибки находятся с большим трудом, и
    интегрированный отладчик поможет вам
    в этом случае наилучшим образом.

    Интегрированный
    отладчик Turbo Pascal.

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

    Интегрированный
    отладчик Turbo Pascal имеет все описанные
    выше возможности и даже более того. Он
    представляет собой встроенную часть
    интегрированной усовершенствованной
    среды Turbo Pascal (IDE): для использования
    предлагаются две основные функции меню
    (Run, Debug), а также некоторые клавиши для
    команд отладчика. Для дополнительной
    информации об IDE горячих клавишах см.
    главу 7 «Справочник по IDE» или
    справочную информацию о Turbo Pascal.

    Что
    может делать отладчик.

    Интегрированный
    отладчик работает очень просто. Ему не
    требуются специальные инструкции в
    Вашем коде, он не увеличивает размер
    Вашего .EXE файла и не требует перекомпиляции
    для создания отдельного .EXE файла после
    окончания отладки.

    Если
    Ваша программа разделена на ряд модулей,
    исходный код каждого из них автоматически
    загружается в редактор при трассировке.

    Если
    Вы используете оверлеи, отладчик
    автоматически обрабатывает их внутри
    IDE, которая выполняет переключения между
    компилятором, редактором и отладчиком.

    Обзор
    возможностей отладчика:

    Трассировка.
    F7

    Run/Trace
    Into Вы можете выполнить одну строку вашей
    программы, затем прерваться и посмотреть
    на результаты. При вызове процедуры или
    функции внутри вашей программы, Вы
    можете задать режим выполнения вызова
    как одного шага или режим трассировки
    этой процедуры или функции строка за
    строкой.

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

    Переход
    на курсор. F4

    Run/Go
    to Сursor Вы можете передвинуть курсор на
    определенную строку в Вашей программе,
    а затем указать отладчику выполнить
    программу до достижения этой строки.
    Это позволяет обходить циклы или другие
    утомительные участки программы, это
    также позволяет перебираться в то место
    программы, откуда Вы хотите начать
    отладку.

    Прерывание.

    С
    помощью команды Debug/Breakpoints Вы можете
    пометить строки в Вашей программе как
    точки прерывания. Когда в процессе
    выполнения Вашей программы достигается
    точка прерывания, выполнение программы
    приостанавливается и отображается
    исходный текст и курсор останавливается
    на строке с точкой прерывания. Затем Вы
    можете проверить значения переменных,
    начать трассировку или выполнить
    программу до другой точки прерывания.
    Вы можете подключить условие к точке
    прерывания. Вы можете также прерваться
    в любой точке Вашей программы, нажав
    клавишу Ctrl-Break. Произойдет остановка на
    следующей строке исходной программы,
    как если бы в этой строке была установлена
    точка прерывания.

    Наблюдение.

    Debug/Watches
    Пользователь имеет возможность задавать
    для просмотра в окне Watch некоторые
    объекты (переменные, структуры данных,
    выражения). Просматриваемые данные
    меняются, отражая текущие изменения в
    программе при пошаговом выполнении.

    Вычисление/модификация
    Ctrl-F4.

    Debug/Evaluate/Modify
    Пользователь может вызвать окно Evaluate,
    что проверить значения переменных,
    структуру данных и выражения в
    интерактивном режиме. Используя окно
    Evaluate, Вы можете изменить значение любой
    переменной, включая строки, указатели,
    элементы массива и поля записей. Это
    обеспечивает простой механизм для
    проверки, как Ваш код реагирует на
    определенную установку значений или
    условий.

    Поиск.

    Пользователь
    может быстро находить объявления
    процедур или функций, даже если программа
    разбита на несколько модулей (Search/Find
    Рrocedure). Во время трассировки Вы можете
    быстро вернуться обратно из вызовов
    процедур или функций и проверить
    параметры каждого вызова (Window/Call Stack).

    Подготовка
    к использованию отладчика.

    До
    начала отладки Вы должны понимать, что
    основным элементом выполнения в отладчике
    является строка, а не оператор. Более
    точно наименьшим элементом выполнения
    является строка. Если на одной строке
    находится несколько операторов, они
    будут выполняться вместе при нажатии
    F7. С другой стороны, если один оператор
    размещен на нескольких строках, то при
    нажатии F7 будет выполняться весь
    оператор. Все команды выполнения
    основываются на строках, включая
    пошаговую отладку и точки прерывания;
    строка, на которой находится выполнение,
    всегда отмечена курсором выполнения.

    Прежде,
    чем начать отладку программы, Вы должны
    задать для компилятора Turbo Pascal инструкцию
    по генерации таблицы символов и таблицы
    номеров строк этой программы. Таблица
    символов представляет собой небольшую
    базу данных со всеми используемыми
    идентификаторами — константами, типами,
    переменными, процедурами и информацией
    о номерах строк. Директивы компилятора
    $D+ и $L+ делают это по умолчанию; они
    соответствуют элементам меню
    Options/Compiler/Debug
    Information и
    Options/Compiler/Local Symbols. Так
    же по умолчанию установлена опция
    Options/Debugger/Integrated, которая генерирует
    отладочную информацию в выполнимом
    файле.

    Директива
    {$D+} генерирует таблицу номеров строк,
    которая устанавливает соответствие
    между объектным кодом и исходным модулем.
    Директива {$L+} генерирует локальную
    отладочную информацию, а именно, строит
    список идентификаторов, локальных для
    каждой процедуры или функции, для того,
    чтобы отладчик мог хранить информацию
    о них в процессе отладки. Когда Вы
    используете директивы компилятора,
    разделяйте их запятыми и без пробелов,
    и ставя $ только перед первой директивой;
    например {$D+,L+}.

    Примечание:
    Вы можете отключить эти переключатели
    для сохранения памяти или дискового
    пространства во время компиляции.

    Когда
    Вы выполняете пошаговую отладку, Turbo
    Pascal будет иногда переключаться на экран
    пользователя, выполнять Ваш код, а затем
    возвращаться в интегрированную среду,
    ожидая следующей команды. Вы можете
    управлять переключением экрана с помощью
    установок Options/Debugger/Display Swapping, которые
    могут принимать 3 значения:

    • Smart:
      Это режим по умолчанию. Среда IDE
      переключается на экран пользователя,
      когда программа обращается к видеопамяти
      или при вызове программы.

    • Always:
      Переключение на экран пользователя
      происходит на каждом шаге.

    • None:
      Переключение экранов не происходит.
      Интегрированная среда остается видимой
      все время. Если в программе предусматривается
      вывод на экран или требуется ввод
      информации, текст будет писаться на
      экране среды. Вы можете восстановить
      окна интегрированной среды, выбирая
      Ё/Refresh Display.

    Начало
    сеанса отладки.

    Наиболее
    быстрый способ начать отладку состоит
    в загрузке программы и выборе команды
    Run/Trace Into (F7). Программа будет компилироваться.
    Когда компиляция завершится, редактор
    отобразит на дисплей тело основной
    программы с индикацией строки выполнения
    на первом операторе begin. Пользователь
    может начать трассировку программы с
    этого места (нажать клавиши F7 или F8) или
    использовать другие методы которые
    приведены ниже.

    Если
    пользователю необходимо начать отладку
    с определенного места программы, он
    может выполнить программу до этого
    места, а затем остановиться. Для этого,
    загрузите нужный раздел исходного
    модуля в редактор и передвиньте курсор
    на строку, где Вы желаете остановиться.
    Затем можно поступить двумя способами:


    • Выбрать команду Run/Goto Cursor (или нажать
      клавишу F4), которая будет выполнять
      программу пользователя до достижения
      строки, помеченной курсором, а затем
      останавить работу программы.


    • Задать на указанной строке точку
      прерывания (выбрать команду Debug/Toggle
      Breakpoint или нажать на Ctrl-F8), затем выполнить
      программу (выполнить команду Run/Run или
      нажать Ctrl-F9); остановка будет происходить
      каждый раз при достижении заданной
      строки. Вы можете задать несколько
      точек прерывания, в этом случае программа
      будет делать остановку всякий раз при
      достижении какой-либо из этих точек.

    Рестарт
    сеанса отладки.

    Если
    в процессе отладки программы возникает
    необходимость начать все сначала, то
    нужно выполнить команду Program Reset из меню
    Run. Система отладки повторно инициализируется,
    и команда следующего шага вернет вас к
    первой строке главной программы. При
    этом производится закрытие всех файлов,
    которые были открыты программой, очистка
    стека всех вложенных программ, которые
    вызывались программой, и освобождение
    всего использованного пространства
    кучи. Переменные программы, однако, не
    будут повторно инициализированы или
    подвержены модификации какого-нибудь
    другого вида. (Turbo Pascal никогда не
    инициализирует переменные автоматически).
    Однако, начальные значения типированных
    констант программы будут восстановлены.

    Turbo
    Pascal также предлагает рестарт, если Вы
    производите какие-либо изменения в
    программе во время отладки. Например,
    если Вы изменяете часть программы, а
    затем выбираете любую команду выполнения
    (нажимаете клавиши F7, F8, F4, Ctrl-F9 и т.д.), Вы
    получите сообщение : Source modified, rebuild? (Y/N)
    (исходный модуль модифицирован, нужно
    повторить сборку? да/нет ). Если Вы
    отвечаете Y, Turbo Pascal будет перекомпилировать
    программу и возобновит отладку программы
    с начала. Если Вы ответите N, Turbo Pascal
    предполагает, что Вы уверены в своих
    действиях, и продолжает сеанс отладки
    дальше. (Любые изменения в программе,
    которые Вы произвели, не будут влиять
    на ее выполнение до тех пор, пока Вы не
    перекомпилируете программу). Если Вы
    добавили или удалили строки программы,
    курсор выполнения не реагирует на эти
    изменения, и может оказаться, что будет
    выделяться ошибочная строка.

    Окончание
    сеанса отладки.

    В
    процессе отладки программы Turbo Pascal
    хранит трассу того, что Вы делаете и где
    находитесь в данный момент. Так как
    пользователь может в процессе отладки
    загружать и даже редактировать различные
    файлы, Turbo Pascal не интерпретирует загрузку
    другого файла в редактор, как конец
    сеанса отладки. Поэтому, если вы желаете
    выполнить или отладить другую программу,
    нужно выполнить команду Run/Program Reset
    (клавиша Ctrl -F2).

    Трассировка
    Вашей программы.

    Простейшая
    техника отладки — это пошаговая отладка,
    которая трассирует внутри процедур и
    функций. Загрузите программу RANGE.PAS в
    Turbo Pascal.

    {$D+,L+}

    {Для
    того, чтобы обеспечить

    полную
    генерацию отладочной информации}

    {$R-}
    {Для того, чтобы отключить проверку
    диапазона}

    program
    RangeTest;

    var

    List:array
    [1..10] of integer;

    Indx:integer;

    begin

    for
    Indx:=1 to 10 do List[Indx]:=Indx;

    Indx:=0;

    while
    (Indx < 11) do

    begin

    Indx:=Indx+1;

    if
    List[Indx]>0 then

    List[Indx]:=-List[Indx]

    end;

    for
    Indx:=1 to 10 do writeln(List[Indx]);

    end.

    Начните
    отладку, нажав клавишу F7. Это пошаговая
    команда. Turbo Pascal произведет компиляцию
    автоматически, а затем подготовится к
    пошаговой обработке этой программы.
    Заметим, что курсор выполнения расположен
    на операторе begin (строка 7). Помните, что
    курсор выполнения помечает следующую
    строку программы, которая должна быть
    выполнена.

    Нажмите
    клавишу F7 несколько раз. Курсор выполнения
    переместится на оператор List[Indx]:=Indx и
    остановится. Это значит, что строка
    выполняется в цикле.

    Выберите
    команду Debug/Watches/Add Watch (Ctrl-F7) для просмотра
    в окне Add Watch. Вы можете просматривать
    значения переменных, структур данных
    или выражений в окне Watch.

    То,
    что появится в окне Add Watch зависит от
    того, где располагается курсор, когда
    Вы нажимаете на клавишу Ctrl-F7. Если курсор
    расположен на первой букве любой
    алфавитно-цифровой строки, внутри строки
    или сразу за ней, строка будет копироваться
    в окно Add Watch и подсвечиваться. Так, если
    курсор был спозиционирован на слове
    Indx, то Indx появится в окне. Если в окне
    необходимо что-либо изменить, начните
    набор на клавиатуре и первоначальное
    выражение и подсветка исчезнут.

    Как
    только появится окно Add Watch, независимо
    от его содержимого, можно добавить в
    него текст, если нажать клавишу Ў (которая
    копирует дополнительный текст из
    редактора). Поместите List в окно, используя
    Ў, и нажмите Enter. Тогда в окне Watch в нижней
    части экрана появится строка:

    List
    : (1,2,0,0,0,0,0,0,0,0)

    Cнова
    нажмите клавишу Ctrl-F7, наберите слово
    Indx и нажмите Enter. Indx будет первым в списке
    в окне Watch:

    Indx
    : 3

    List
    : (1,2,0,0,0,0,0,0,0,0)

    Нажмите
    клавишу F7 снова и Вы увидите, что значения
    Indx и List в окне Watch изменятся, отражая
    работу Вашей программы.

    Как
    только Вы войдете в цикл while, Вы снова
    увидите, что значения Indx и List изменяются
    шаг за шагом. Заметим, что эти изменения
    в окне Window отражают действия каждой
    строки цикла после нажатия клавиши F7.

    Продолжайте
    нажимать на клавишу F7, пока не достигнете
    начала цикла while, c Indx равным 10. Во время
    прохождения через цикл, Вы можете
    наблюдать как изменяются значения в
    окне Watch. Когда выполняется оператор

    List
    [ Indx ] := — List [ Indx ];

    значение
    Indx изменится на -11. Если Вы продолжаете
    нажимать на F7, то обнаружится, что вы
    вошли в бесконечный цикл.

    Таким
    образом, если Вы наберете такую программу,
    она будет компилироваться и выполняться.
    Получается бесконечный цикл, так как
    цикл while выполняется 11 раз, а не 10, и
    последнее значение переменной Indx равно
    11. Так как массив List содержит только 10
    элементов, значение List(11) будет указывать
    на некоторую позицию памяти вне массива
    List. Из-за способа распределения переменных
    уже окажется, что значение List(11) займет
    в памяти тоже место, что и переменная
    Indx. Это значит, что при Indx=11, запись:

    List
    [Indx] := — List [Indx]

    идентична
    записи

    Indx
    := -Indx.

    Так
    как значение переменной Indx равно 11, этот
    оператор изменит ее значение на -11. В
    результате в программе начнется повторное
    выполнение цикла. Этот цикл теперь
    изменяет дополнительные байты в месте,
    соответствующем List[-11..0]. И т.к. значение
    Indx никогда не будет заканчивать цикл
    со значением большим или равным 11, то
    цикл никогда не закончится.

    Важно
    отметить то, что используя лишь две
    клавиши (F7 и Ctrl — F7), через несколько
    минут, Вы быстро и легко прослеживаете
    промежуточные значения переменных и
    находите ошибку.

    Пошаговое
    выполнение программы.

    Различие
    между командами Trace Into (F7) и Step Over (F8) в
    том, что при использовании F7 осуществляется
    трассировка внутри процедур и функций,
    в то время как использование F8 приведет
    к обходу вызовов подпрограмм. Эти команды
    имеют особое значение при выполнении
    оператора begin основной программы, если
    программа использует модули, имеющие
    раздел инициализации. В этом случае,
    использование F7 приведет к трассировке
    раздела инициализации каждого модуля,
    что позволяет увидеть, что инициализируется
    в каждом модуле. При использовании F8
    эти разделы не будут трассироваться, и
    курсор выполнения переходит на следующую
    строку после begin.

    Рассмотрим
    следующий (неполный) пример программы:

    ($D+,L+)

    program
    TestSort;

    const

    NLMax=100;

    type

    NumList=array[1..NLMax]
    of integer;

    var

    List
    : NumList;

    I,Const
    : word;

    procedure
    Sort ( var L:NumList; Cnt:Integer);

    begin

    (sort
    the list) (сортировка
    списка)

    end;
    (of proc sort) (процедуры
    Sort)

    begin

    randomize;

    Count:=NLMax;

    for
    I:=1 to Count do

    List[I]
    := Random(1000);

    sort(List,Count);

    for
    I:=1 to Count do

    Write(List[I]
    :8);

    Readln

    end.
    {программы
    TestSort}

    Предположим,
    что Вы отлаживаете процедуру Sort. Вы
    хотите осуществить трассировку процедуры
    Sort, включая проверку значения внутри
    List до вызова Sort. Однако, выполнять 100 раз
    инициализацию внутри List очень утомительно.
    Есть ли способ выполнять цикл, не
    останавливаясь на каждой выполняемой
    строке.

    Да,
    фактически, существует несколько
    способов. Во-первых, Вы могли бы выделить
    этот цикл в отдельную процедуру и нажать
    клавишу F8 для того, чтобы обойти ее
    трассировку, но это слишком нерационально.
    Во-вторых, Вы могли бы установить внутри
    программы точку прерывания. Мы объясним,
    что это за точки прерывания, и как они
    используются немного позже. В конце
    концов, Вы могли бы использовать команду
    Run/Go to Cursor (F4). Переместите курсор на
    строку с вызовом Sort, а затем нажмите на
    клавишу (F4). Ваша программа будет
    выполняться до достижения строки,
    помеченной курсором. Курсор выполнения
    переместится на эту строку; затем Вы
    можете начать трассировку с этого места,
    нажимая на клавишу F7, для того, чтобы
    можно было сделать трассировку внутри
    Sort.

    Команда
    Run/Goto Cursor (F4) действует на вложенных
    уровнях вызовов подпрограмм, даже если
    их исходный код находится в другом
    файле. Например, Вы могли бы разместить
    курсор где-либо внутри процедуры Sort и
    нажать на клавишу F4; программа выполнялась
    бы до этой строки. По существу, Sort могла
    бы быть выделена в отдельный модуль,
    отладчик бы уже знал, когда нужно
    остановиться и что отобразить.

    Существуют
    три случая, когда команда Go to Cursor (F4) не
    будет выполнять программу до отмеченной
    курсором строки.

    Первый,
    когда Вы расположили курсор между двумя
    выполняемыми строками; например, на
    пустой строке или строке с комментариями.
    В этом случае программа будет выполняться
    до следующей строки, содержащей оператор,
    который может быть выполнен.

    Второй
    случай, когда курсор расположен вне
    процедурного блока, например, на операторе
    объявления переменной или операторе
    program. Отладчик будет выводить сообщение
    «no code generated for this line» (для этой строки
    код не генерируется).

    Третий
    случай, когда Вы располагаете курсор
    на строке, которая никогда не выполняется.
    Например, строка располагается выше
    курсора выполнения (предполагается,
    что вы находитесь не в цикле) или строка
    является частью else — условного оператора,
    когда выражение if имеет значение true. В
    этом случае отладчик будет действовать
    так, как если бы выполнялась команда
    Run/Run (Ctrl-F9); программа будет выполняться
    до конца или до точки прерывания.

    Предположим,
    что Вы трассируете процедуру Sort,затем
    хотите завершить работу программы и
    посмотреть выходные результаты. Каким
    способом сделать это? Сначала нужно
    переместить курсор к последнему оператору
    end основной части программы, а затем
    выполнить команду Run/Go to Cursor (F4). Или
    проще, нужно выполнить команду Run/Run
    (Ctrl-F9). Она позволяет отладчику продолжить
    нормальное выполнение программы
    пользователя. Программа будет выполняться
    до конца, или до тех пор, пока Вы не
    достигнете точки прерывания или не
    будет нажат Ctrl-Break.

    Использование
    точек прерывания.

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

    Примечание:
    Вы можете иметь до 16 активных точек
    прерывания.

    Заметим,
    что точки прерывания существуют только
    во время сеанса отладки; они не сохраняются
    в файле .EXE, если программа компилируется
    на диск. Чтобы задать точку прерывания,
    используйте обычные команды редактирования
    для перемещения курсора на каждую строку
    программы, где Вы хотите сделать паузу.
    Каждый раз выполняйте команду Debug/Toggle
    Breakpoint (Ctrl-F8). Когда строка отмечается
    как точка прерывания, она высвечивается.
    Это не должна быть пустая строка,
    комментарии, директивы компиляции;
    объявления констант, типов, меток,
    переменных; заголовком программы,
    модуля, процедуры или функции. Как только
    Вы задали точки прерывания, выполняйте
    программу с помощью команды Run/Run (клавиша
    Ctrl-F9). Сначала программа будет выполняться
    нормально. Когда встретится точка
    прерывания, программа остановится.
    Соответствующий исходный файл (основная
    программа, модуль или включенный файл)
    загружается в окно Edit, которое
    визуализируется на экране и курсор
    выполнения помещается на строку с точкой
    прерывания.

    Заметим,
    что точка прерывания не высвечивается,
    когда на ней находится курсор выполнения.
    Если какие-либо переменные или выражения
    были добавлены в окно Watch, то они также
    выводятся на дисплей со своими текущими
    значениями.

    Затем,
    пользователь может использовать любой
    режим отладки.

    • Вы
      можете осуществлять пошаговое выполнение
      программы, используя команду Run / Trace
      Into, Step Over или Go to Cursor (F7, F8 или F4). Вы можете
      проверить или изменить значения
      переменных.

    • Вы
      можете добавить или удалить выражения
      из окна Watch.

    • Можно
      назначить или удалить точки прерывания.

    • Можно
      просмотреть выходные результаты
      программы, используя команду Windows/User
      Screen (Alt-F5).

    • Вы
      можете перезапустить программу сначала
      ( Run/Program Reset и, затем, команду пошагового
      выполнения).

    • Можно
      продолжить выполнение до следующей
      точки прерывания (или до конца программы),
      выполнив команду Run/Run (Ctrl-F9).

    Для
    удаления точки прерывания из строки
    переместите курсор на данную строку и,
    выполнив команду Debug/Toggle Breakpoint (или
    нажмите Ctrl-F8) еще раз. Эта команда включает
    или отключает точку прерывания в строке;
    если она используется для строки с
    точкой прерывания, то строка становится
    нормальной.

    Давайте
    вернемся к примеру, который был рассмотрен
    ранее.

    begin
    {основная часть программы Test.Sort}

    Randomize;

    Count
    := NLMax;

    for
    I := 1 to Count do

    List
    [I] := Random (1000);

    Sort
    ( List,Count );

    for
    I := 1 to Count do

    Write
    ( List [I] : 8 );

    Readln

    end.
    {программа
    Test.Sort}

    Как
    уже говорилось, идея была в том, чтобы
    обойти первоначальный цикл и начать
    трассировку с вызова процедуры Sort. Новый
    вариант. Передвиньте курсор на строку
    с вызовом процедуры и выполните команду
    Debug/Toggle Breakpoint ( Ctrl-F8), которая отметит
    строку, как точку прерывания. Теперь
    выполните программу до этой точки,
    используя команду Run/Run (Ctrl-F9 ). Когда
    программа достигнет этой строки, она
    остановится и позволит Вам начать
    отладку.

    Использование
    Ctrl-Break.

    Кроме
    назначения точек прерывания, пользователь
    может сделать немедленную остановку
    во время выполнения программы, используя
    клавишу Ctrl-Break. Это означает, что можно
    прервать работу программы в любое время.
    Когда Вы нажимаете на клавишу Ctrl-Break,
    выполнение программы прекращается. Вы
    возвращаетесь в редактор, курсор
    выполнения расположен на следующей
    строке программы, и программа готова к
    дальнейшему пошаговому выполнению.

    Фактически,
    отладчик автоматически подключает DOS,
    BIOS и другие сервисные функции. Он знает,
    является ли текущий выполняющийся код
    программой DOS, программой BIOS или программой
    пользователя. Когда Вы нажимаете на
    клавишу Ctrl-Break, отладчик ждет, пока
    программа выполняется сама. Затем он
    делает пошаговое выполнение инструкций
    машинного уровня, пока следующая
    инструкция не будет в начале строки
    исходного кода на Паскале. С этого
    момента отладчик прекращает работу,
    перемещает курсор выполнения на эту
    строку и предлагает Вам нажать на клавишу
    ESC.

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

    Просмотр
    значений.

    Выполнение
    программы предоставляет много информации,
    но не в том объеме, как хотелось бы. Может
    возникнуть необходимость просмотреть
    за тем, как изменяются значения переменных
    во время выполнения программы. Рассмотрим
    процедуру Sort из предыдущей программы:

    procedure
    Sort ( var L : NumList; C : word );

    var

    Top,Min,k
    : word;

    Temp
    : integer;

    begin

    for
    Top := 1 to C-1 do

    begin

    Min
    := Top;

    for
    k := Top+1 to C do

    if
    L[k] Top then

    begin

    Temp
    := L[Top];

    Top
    := L[Min];

    L[Min]
    := Temp;

    end;

    end;

    end;
    {процедуры
    Sort}

    Примечание:
    Измените NLMax в теле программы на 10 так,
    чтобы Вы могли работать с меньшим
    массивом.

    В
    этой процедуре есть ошибки, будем
    просматривать ее (используя команду
    Run/Trace Into или клавишу F7) и наблюдать за
    значениями переменных L, Top, Min и k.

    Отладчик
    дает возможность пользователю задать
    объекты для просмотра во время выполнения
    Вашей программы. Как Вы и предполагаете,
    объектами просмотра являются переменные,
    структуры данных и выражения, расположенные
    в окне Watch, где отображаются их текущие
    значения, обновляемые по мере выполнения
    каждой строки программы. Давайте вернемся
    к предыдущему примеру. Установить
    объекты наблюдения просто.

    Передвигайте
    курсор к каждому идентификатору и
    выполняйте команду Debug/Watch/Add Watch (Ctrl -F7)
    для добавления каждого выражения в окно
    Watch.

    Результат
    может выглядеть так:

    k
    : 21341

    Min
    : 51

    Top
    :21383

    L
    : (163,143,454,622,476,161,850,402,375,34)

    Предполагается,
    что Вы только что вошли в процедуру
    Sort, курсор выполнения расположен на
    начальном операторе begin. (Если Вы еще не
    вошли в процедуру Sort, то для каждого
    выражения в окне Watch будет появляться
    сообщение «unknown identifier» (неизвестный
    идентификатор), пока Вы не войдете в
    процедуру). Заметим, что переменные K,
    Min и Top имеют произвольные значения, т.к.
    они еще не были инициализированы.
    Значения переменной L, предположительно,
    тоже должно быть произвольным; они не
    будут таковыми при выполнении всей
    программы; все они должны быть
    неотрицательными и лежать в интервале
    от 0 до 999.

    Если
    нажать на клавишу F7 четыре раза, то мы
    продвинемся к строке if L[k]Top then, назад к
    вершине внешнего цикла, и снова вниз к
    строке if L[k] < L[Min] then. В этот момент окно
    Watch будет выглядеть следующим образом
    (для L даны предыдущие значения):

    k
    : 3

    Min
    : 2

    Top
    : 2

    L
    : ( 34,143,454,622,476,161,850,402,375,34 )

    Теперь
    Вы можете заметить две вещи. Первое,
    последнее значение переменной L(34),
    которое является также и наименьшим
    значением, скопировалось в первое
    значение L, и значение, которое уже было
    там раньше (163), исчезло. Второе, переменные
    Min и Top имели одинаковые значения во
    время трассировки процедуры. Фактически,
    Вы можете заметить, что переменная Min
    получает значение переменной Top, но она
    никогда не изменяется где-либо еще.
    Однако, ниже цикла располагается
    проверка:

    if
    Min<>Top then.

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

    Min
    := k, вместо L[Min] := L[k].

    Исправьте
    строку, переместите курсор к первоначальному
    оператору begin в процедуре Sort и выполните
    команду Run/Go to Cursor (F4). Так как Вы изменили
    программу, на экране появится окно с
    вопросом Source modified, rebild? (Y/N) (исходный
    модуль модифицирован, нужна ли сборка?
    Да/Нет). Ответьте Y. Программа будет
    перекомпилироваться, начнется ее
    выполнение, затем произойдет остановка
    на начальном операторе begin процедуры
    Sort. Теперь программа работает верно.
    Значение первого элемента теперь не
    меняется на наименьшее из значений
    элементов массива L, происходит
    обмен-перемещение значения первого
    элемента массива на место, где до этого
    располагался элемент с наименьшим
    значением. Затем процесс повторяется
    со второй позицией, третьей и т.д., пока
    список элементов не будет отсортирован
    полностью.

    Паскаль
    — это один из самых простых языков, но
    далеко не один из самых слабых. Изучать
    мы с вами будем Turbo
    Pascal 7.0

    так вот на нем можно написать любую
    программу, которая придет в голову. По
    возможностям он не уступает ни СИ, ни
    какому другому. На Паскале можно написать
    программную оболочку (типа Norton Commander),
    игрушку (типа Quake) или операционную
    систему (типа MS-DOS). Программы на Turbo
    Pascal пишутся только для платформы MS-DOS,
    но никак не зависят от конфигурации
    компьютера. Главным требованием к
    компьютеру является только лишь то,
    чтобы он был IBM PC-совместимый, что
    естественно, если на нем установлен
    MS-DOS.

    Особой
    теории по этому языку нет, чтобы хорошо
    им овладеть (тем более если это ваш
    первый язык программирования) необходимо
    больше практики. Этим мы и начнем
    заниматься уже в этом выпуске. При этом
    вам понадобиться интерпритатор Turbo
    Pascal 7.0
    фирмы
    Borland — я говорил где его можно достать в
    предыдущем выпуске. Те, кто скачал его
    с моего сайта (а скачало на данный момент
    73 человека) или достал где-нибудь еще,
    уже смогут попрактиковаться.

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

    Итак,
    поехали…

    Сообщения и коды ошибок

    Сообщения и коды ошибок

    1. Out of memory (выход за границы памяти)
    2. Компилятору не хватает памяти. Имеется ряд возможных решений этой проблемы:

      • Если в опции COMPILE/DESTINATION установлено значение MEMORY, замените эту опцию на DISK.
      • Если в опции OPTIONS/COMPILER/LINK установлено значение MEMORY, замените эту опцию на DISK.
      • Если Вы используете постоянно помещенные в память (резидентные) обслуживающие программы, такие как WINDOWS, SIDEKICK, NORTON
        удалите их из памяти.
      • Если Вы используете интегрированную среду TURBO.EXE, то попробуйте воспользоваться компилятором ТРС.ЕХЕ, он занимает меньше памяти.
      • Если ни одна из рекомендаций не помогает, то, возможно, Ваша программа просто слишком велика, чтобы компилировать ее в таком объеме памяти. В этом случае Вы должны разбить её на два или более модулей.
    3. Indentifier expected (не указан идентификатор). Этот идентификатор не был описан.
    4. Unknow indentifier (неизвестный идентификатор). Этот идентификатор не был описан.
    5. Duplicate indentifier (двойной идентификатор). Попытка дважды описать один и тот же идентификатор.
    6. Syntax error (синтаксическая ошибка). В исходном тексте найден неверный символ. Возможно, Вы забыли заключить в кавычки строковую константу.
    7. Error in real constant (ошибка в вещественной константе).
    8. Error in integer constant (ошибка в целой константе). Учтите, что после целых действительных чисел, превышающих диапазон представления целых чисел (-2147483648…+2147483647), должны ставиться точка и нуль, например 12345678912.0.
    9. String constant exceeds line (строковая константа превышает допустимые размеры). Вероятно, Вы забыли поставить апостроф в конце строковой константы.
    10. Too many nested files (слишком много вложенных файлов). Компилятор допускает не более пяти вложенных исходных файлов.
    11. Unexpected end of file (не найден конец файла).
      Вы могли получить это сообщение об ошибке по одной из следующих причин:

      • Ваш исходный файл закончился перед последним END основного раздела< операторов. Вероятно, в Вашей программе неодинаковое количество операторов BEGIN и END.
      • Включаемый файл заканчивается в середине раздела операторов. Каждый
        раздел операторов должен целиком помещаться в одном файле.
      • Вы не закончили комментарий.
    12. Line to long (слишком длинная строка). Максимальная длина строки, обрабатываемой компилятором, равна 126 символам (обратите внимание: редактор среды может обрабатывать до 249
      символов в строке).
    13. Type identifier expected (здесь нужен идентификатор типа). Не указан тип
      идентификатора.
    14. Too many open files (слишком много открытых файлов). Если появляется эта ошибка, то это означает, что конфигурационный файл CONFIG.SYS операционной системы не включает параметр FILES=XX или этот параметр указывает слишком мало файлов. Увеличьте число файлов до нужного значения, например, до 20.
    15. Invalid file name (неверное имя файла). Имя файла не верно или указан несуществующий путь.
    16. File not found (файл не найден). Файл не был найден в просмотренных
      каталогах.
    17. Disk full (диск заполнен). Удалите некоторые файлы или воспользуйтесь
      новым диском.
    18. Invalid compiler directive (неправильная директива компилятора). Неверная буква в директиве компилятора, один из параметров директивы компилятора неверный, или Вы пользуетесь глобальной директивой компилятора, когда компиляция тела программы уже началась.
    19. Too many files (слишком много файлов). В компиляции программы или программного модуля участвуют слишком много файлов. Попытайтесь не использовать так много файлов, например, объединяя включаемые файлы.
    20. Undefined type in pointer definition (неопределенный тип в объявлении указателя). Попытка объявить типизированный указатель, связанный с необъявленным типом данных.
    21. Variable identifier expected (отсутствует идентификатор переменной). На
      этом месте должен быть идентификатор переменной.
    22. Error in type (ошибка в объявлении типа). Объявление типа не может начинаться с этого символа.
    23. Structure too lage (слишком большая структура). Максимально допустимый размер любого структурированного типа -65520 байт.
    24. Set base type of range (базовый тип множества нарушает границы). Базовый тип множества должен представлять собой тип-диапазон с границами в пределах от 0 до 255 или перечисляемый тип с не более чем 256 значениями.
    25. File components may not be files (компонентами файла не могут быть файлы). Конструкции типа файл файлов не допускаются.
    26. Invalid string length (неверная длина строки). Длина строки должна находиться в диапазоне от 1 до 225.
    27. Type mismatch (несоответствие типов). Это сообщение может быть вызвано
      следующими причинами:

      • Несовместимые типы переменной и выражения в операторе присваивания.
      • Несовместимые типы фактического и формального параметров в обращении к процедуре или функции.
      • Тип выражения несовместим с типом индекса при индексировании массива.
      • Несовместимые типы операндов в выражении.
    28. Invalid subrange base type (неправильный базовый тип для типа-диапазона).Допустимыми базовыми типами являются все порядковые типы.
    29. Lower bound greater than upper bound (нижняя граница больше верхней).Описание типа-диапазона содержит неправильные границы.
    30. Ordinal type expected (нужен порядковый номер). Вещественные, строковые, структурные, процедурные типы и указатели в данном месте программы не допускаются.
    31. Integer constant expected (нужна целая константа).
    32. Constant expected (нужна константа).
    33. Integer or real constant expected (нужна целая или вещественная константа).
    34. Type identifier expected (нужен идентификатор типа).
    35. Invalid function result type (неправильный тип результата функции). Правильными типами результата функции являются все простые типы, строковые типы и указатели.
    36. Label identifier expected (нужен идентификатор метки). Метка не обозначена с помощью идентификатора, как это требуется из контекста программы.
    37. BEGIN expected (нужен BEGIN).
    38. END expected (нужен END).
    39. Integer expression expected (нужно выражение типа INTEGER).
    40. Ordinal expression expected (нужно выражение перечисляемого типа). Предшествующее выражение должно иметь перечисляемый тип.
    41. Boolean expression expected (нужно выражение типа BOOLEAN). Предшествующее выражение должно иметь тип BOOLEAN.
    42. Operand types do not match operator (типы операндов не соответствуют операции). Данная операция не может быть применена к указанным операндам, например, ‘A’ div ‘2’.
    43. Error in expression (ошибка в выражении). Данный символ не может участвовать в выражении указанным образом. Возможно, Вы забыли указать операцию между двумя операндами.
    44. Illegal assignment (неверное присваивание). Файлам и не типизированным переменным нельзя присваивать значения. Идентификатору функции можно присвоить значение только внутри раздела операторов данной функции.
    45. Field identifier expected (нужен идентификатор поля). Попытка использовать запись целиком в том месте, где требуется ссылка на какое-либо поле записи.
    46. Object file too large (объектный файл слишком большой). Турбо-Паскаль не может компоновать файлы .obj больше 64 Кбайт.
    47. Undefined external (неопределенная внешняя процедура). Внешняя процедура или функция не имеет соответствующего определения PUBLIC в объектном файле. Убедитесь, что вы указали все объектные файлы в директивах (SL filename} и проверьте написание идентификаторов процедуры или функции в файле .asm.
    48. Invalid object file record (неправильная запись объектного файла). Файл .obj содержит неверную объектную запись. Убедитесь, что данный файл является действительно файлом .obj
    49. Code segment too large (сегмент кода слишком большой). Максимальный размер кода программы или программного модуля равняется 65520 байт. Если вы компилируете программный модуль, разбейте его на два или более программных модуля.
    50. Data segment too large (сегмент данных слишком велик). Максимальный размер сегмента данных программы равен 65520 байт, включая данные, используемые программными модулями. Если вам нужно большее количество глобальных данных, опишите большие структуры с помощью указателей и выделяйте для них память с помощью процедуры NEW.
    51. DO expected (нужен оператор DO).
    52. Invalid PUBLIC definition (неверное определение PUBLIC). Возможные причины сообщения:
      • Данный идентификатор получил тип PUBLIC, с помощью соответствующей директивы языка ассемблер, но не соответствует описанию EXTERNAL в программе или программном модуле Паскаля.
      • Две или более директивы PUBLIC языка ассемблер определяют один и тот же идентификатор.
      • Файлы .obj определяют символы PUBLIC, не находящиеся в сегменте CODE.
    53. Invalid EXTRN definition (неправильное определение EXTRN). Возможные причины сообщения:
      • Программа на ассемблере ссылается с помощью директивы ETRN на идентификатор, который не описан в программе на Паскале и не был описан в интерфейсных секциях используемых программных модулей.
      • Ассемблерная программа ссылается на идентификатор, обозначающий абсолютную переменную (т.е. определённую словом ABSOLUTE).
      • Ассемблерная программа ссылается на идентификатор процедуры или функции типа INLINE.
    54. Too many EXTRN definition (слишком много определений типа EXTRN).Турбо-Паскаль не может обрабатывать файлы .obj при более чем 256 определениях EXTRN.
    55. OF expected (требуется OF).
    56. INTERFACE expected (требуется интерфейсная секция).
    57. Invalid relocatable reference (недействительная перемещаемая ссылка). Возможные причины сообщения:
      • Файл .obj содержит данные и перемещаемые ссылки в сегментах, отличных от CODE. Например, Вы пытаетесь описать инициализированные переменные в сегменте DATA.
      • Файл .com содержит ссылки с размерами в байтах на перемещаемые символы. Такая ошибка происходит в случае, если Вы используете, операторы HIGH и DOWN с перемещаемыми символами или если Вы ссылаетесь в директивах DB на перемещаемые символы.
      • Операнд ссылается на перемещаемый символ, который не был определен в сегменте CODE или в сегменте DATA.
      • Операнд ссылается на процедуру EXTRN или функцию EXTRN со сдвигом, например, CALL SortProc +8.
    58. THEN expected (требуется THEN).
    59. TO or DOWNTO expected (требуется ТО или DOWNTO).
    60. Undefined forward (неопределенное опережающее описание). Возможные причины сообщения:
      • Были описаны процедура или функция в интерфейсной секции программного модуля, но их определение отсутствует в секции реализации.
      • Процедуры или функции были описаны с помощью опережающего описания, но их определение не найдено.
    61. Too many procedures (слишком много процедур). Турбо-Паскаль не допускает более 512 процедур или функций в одном модуле. Если Вы компилируете программу, то поместите некоторые процедуры или функции в модули. Если Вы компилируете модуль, то разбейте его на два или несколько модулей.
    62. Invalid typecast (неверное преобразование типа). Возможные причины сообщения:
      • Попытка разместить в памяти, занимаемой некоторой переменной, значение выражения другого типа в случае, когда размер размещаемого значения не равен размеру переменной.
      • Вы пытаетесь осуществить преобразование типа выражения, когда разрешается только ссылка на переменную, процедуру или функцию.
    63. Division by zero (деление на ноль). Предшествующая операция пытается выполнить деление на ноль.
    64. Invalid file type (неверный файловый тип). Данный файловый тип не обслуживается процедурой обработки файлов. Например, процедура READLN используется для типизированного файла, или процедура SEEK -для текстового файла.
    65. Cannot Read or Write variables of this type (нет возможности считать или записать переменные данного типа). Нарушены следующие ограничения:
      • Процедуры READ и READLN могут считывать переменные символьного, целого, действительного и строкового типа.
      • Процедуры WRITE и WRITELN могут выводить переменные символьного, целого, действительного, логического и строкового типа.
    66. Pointer variable expected (нужно использовать переменную-указатель). Предыдущая переменная должна быть указателем.
    67. String variable expected (нужна строковая переменная). Предшествующая переменная должна иметь строковый тип.
    68. String expression expected (нужно выражение строкового типа). Предшествующее выражение должно иметь строковый тип.
    69. Unit not found (программный модуль не найден). Один или несколько программных модулей, используемых данным модулем, не указаны в предложении USES.
    70. Unit name mismatch (несоответствие имен программных модулей). Имя программного модуля, найденное в файле .tpu, не соответствует имени, указанному в предложении USES.
    71. Unit version mismatch (несоответствие версий программных модулей). Один или несколько программных модулей, используемых данной программой, были изменены после их компиляции. Воспользуйтесь опцией COMPILE/MAKE или COMPILE/BUILD в интегрированной интерактивной среде или опциями /М или /В в компиляторе ТРС, что позволит автоматически скомпилировать программные модули, нуждающиеся в перекомпиляции.
    72. Duplicate unit name (повторное имя программного модуля). Вы уже указали этот программный модуль в операторе USES.
    73. Unit file format error (ошибка формата файла модуля). Файл .tpu является недействительным. Убедитесь, что это действительно файл .tpu.
    74. Implementation expected (отсутствует исполняемая часть модуля).
    75. Constant and case types do not match (типы констант и тип выражения оператора CASE не соответствуют друг другу). Тип константы оператора CASE не совместим с выражением в операторе варианта.
    76. Record variable expected (нужна переменная типа запись). Предшествующая переменная должна иметь тип запись.
    77. Constant out of range (константа нарушает границы). Возможные причины сообщения:
      • Вы пытаетесь указать индекс массива, выходящий за его границы.
      • Вы пытаетесь присвоить переменной значение, выходящее за границы, допустимые для типа этой переменной.
      • Вы пытаетесь передать в качестве фактического параметра процедуре или функции константу, выходящую за границы, допустимые для типа соответствующего формального параметра.
    78. File variable expected (нужна файловая переменная). Предшествующая переменная должна иметь файловый тип.
    79. Pointer expression expected (нужно выражение типа указатель).
      Предшествующее выражение должно иметь тип указателя.
    80. Integer or real expression expected (нужно выражение типа REAL или INTEGER). Предшествующее выражение должно иметь тип (REAL или INTEGER)
    81. Label not within current block (метка не находится внутри текущего блока). Оператор GOTO не может ссылаться на метку, находящуюся вне текущего блока.
    82. Label already defined (метка уже определена). Данная метка уже помечает оператор.
    83. Undefined label in processing statement part (неопределенная метка в предшествующем разделе операторов). Данная метка была описана, и на неё осуществлялась ссылка в предшествующем разделе операторов, но она не указана в тексте программы.
    84. Invalid @ argument (недействительный аргумент операции @).Действительными аргументами являются идентификаторы переменных, процедур и функций.
    85. Unit expected (нужно кодовое слово UNIT).
    86. «;» expected (нужно указать «;» ).
    87. «:» expected (нужно указать «:» .
    88. «,» expected (нужно указать «,» ).
    89. «(» expected (нужно указать «(» ).
    90. «)» expected (нужно указать «)» ).
    91. «=» expected (нужно указать «=» ).
    92. «:=» expected (нужно указать «:=» ).
    93. «[» or «(.» expected (нужно «[» или «(.»).
    94. «]» or «.)» expected (нужно «]» или «.)»).
    95. «.» expected (нужно «.»).
    96. «..» expected (нужно «..»).
    97. Too many variables (слишком много переменных). Возможные причины сообщения:
      • Общий размер глобальных переменных, описанных в программе или программном модуле, не может превышать 64 Кбайт.
      • Размер локальных переменных, описанных в программе или функции, не может превышать 64 Кбайт.
    98. Invalid FOR control variable (неправильная управляющая переменная оператора FOR). Управляющая переменная оператора FOR должна быть переменной перечисляемого типа, определенной в разделе описаний текущей программы.
    99. Integer variable expected (нужна переменная целого типа) предшествующая переменная должна иметь целый тип. )
    100. Files are not allowed here (здесь не допускаются файлы). Типизированная константа не может иметь файловый тип.
    101. String length mismatch (несоответствие длины). Длина строковой константы не соответствует количеству элементов символьного массива.
    102. Invalid ordering of fields (неверный порядок полей). Поля в константе типа запись должны записываться в порядке их описания.
    103. String constant expected (нужна константа строкового типа).
    104. Integer or real variable expected (нужна переменная типа INTEGER или REAL). Предшествующая переменная должна иметь целый или вещественный тип.
    105. Ordinal variable expected (нужна переменная порядкового типа). Предшествующая переменная должна иметь порядковый тип.
    106. INLINE error (ошибка в операторе INLINE). Оператор «<» не допускается в сочетании с перемещаемыми ссылками на переменные. Такие ссылки всегда имеют размер в слово.
    107. Character expression expected (предшествующее выражение должно иметь символьный тип).
    108. Too many relocation items (слишком много перемещаемых элементов).Размер таблицы перемещения файла .ехе превышает 64К, что является верхним пределом в Турбо-Паскале. Если вы обнаружили эту ошибку, то это значит, что программа просто слишком велика для обработки компоновщиком Турбо-Паскаля. Возможно также, что она слишком велика для выполнения в PC DOS. В таком случае нужно выделить в программе основной раздел, который выполнял бы обращение к двум или более вспомогательным разделам с помощью процедуры EXEC из модуля DOS.
    109. Not enough memory to run program (недостаточно памяти для выполнения программы). Недостаточно памяти для выполнения программы из среды Турбо-Паскаля. Попытайтесь воспользоваться рекомендациями, связанными с ошибкой 1. Если это не поможет, то скопируйте свою программу на диск, выйдите из среды и запустите программу средствами ДОС.
    110. Cannot find EXE file (невозможно найти файл .ехе). по какой-то причине файл .ехе сгенерированный ранее компилятором, исчез.
    111. Cannot run a unit (модуль выполнить нельзя). Вы не можете выполнить программный модуль. Чтобы проверить его, напишите программу, использующую этот программный модуль.
    112. Compilation aborted (компиляция прервана). Компиляция была прервана с помощью CTRL-BREAK.
    113. CASE constant out of range (константа CASE нарушает допустимые границы). Целочисленные константы оператора CASE должны находиться в диапазоне от -32768 до 32767.
    114. Error in statement (ошибка в операторе). Данный символ не может быть первым символом в операторе.
    115. Cannot call an interrupt procedure (невозможно вызвать процедуру прерывания). Вы не можете непосредственно вызвать процедуру прерывания.
    116. Must have an 8087 to compile this (для компиляции необходимо наличие сопроцессора 8087). Для компиляции программ и программных модулей в режиме {$N+} необходим сопроцессор 8087. Используйте программную эмуляцию сопроцессора с помощью директивы {$N+.E+}.
    117. Must be in 8087 mode to compile this (для компиляции необходим режим 8087). Данная программа может быть скомпилирована только в режиме {$N+}. В состоянии {$N-} операции с типами SINGLE, DOUBLE, EXTENDED и СОМР не допускаются.
    118. Target address not found (указанный адрес не найден). Команда COMPILER/FIND ERROR в среде Турбо-Паскаля или опция /F в командной строке компилятора ТРС.ЕХЕ не обнаружила оператор, соответствующий заданному адресу.
    119. Include files are not allowed here (здесь не допускаются включаемые файлы). Раздел операторов должен целиком размещаться в одном файле.
    120. TMP file format error (ошибка формата файла .ТМР). Файл .ТМР является недействительным. Убедитесь, что этот файл является в действительности файлом .ТМР.
    121. NIL expected (нужен NIL).
    122. Invalid qualifier (неверный идентификатор). Возможные причины сообщения:
      • Вы пытаетесь индексировать переменную, которая не является массивом.
      • Вы пытаетесь указать поля в переменной, которая не является записью.
      • Вы пытаетесь использовать в качестве указателя переменную, которая не является указателем.
    123. Invalid variable reference (недействительная ссылка на переменную). Предыдущая конструкция удовлетворяет синтаксису ссылки на переменную, но она не указывает адрес памяти. Наиболее вероятно, что Вы вызываете функцию-указатель, но забываете поставить знак ? после неё.
    124. Too many symbols (слишком много символов). Программа или программный модуль содержат более 64 Кбайт символов. Если Вы компилируете программу с директивой {$D+},xo попробуйте отключить эту директиву или разбейте программу на несколько модулей.
    125. Statement part too large (слишком большой раздел операторов). Турбо-Паскаль ограничивает размер раздела операторов примерно до 24 Кбайт. Если Вы обнаружили эту ошибку, поместите части раздела операторов в одну или несколько процедур и вообще сделайте Вашу программу более структурированной.
    126. Module has no debug information (в модуле нет отладочной информации). Ошибка периода выполнения обнаружена в модуле (программе), который не имеет отладочной информации, и по этой причине Турбо-Паскаль не может указать соответствующий оператор. Перекомпилируйте модуль с включенной опцией {$D+} или воспользуйтесь опцией COMPILER/FIND ERROR, чтобы найти эту ошибку.
    127. Files must be var parameters (файлы должны передаваться как параметры-переменные). Вы пытаетесь передать процедуре или функции параметр-значение файлового типа. Параметры файлового типа должны быть параметрами-переменными.
    128. Too many conditional symbols (слишком много условных символов). Не хватает памяти для определения условных символов (слов, управляющих командами условной компиляции). Попытайтесь удалить некоторые символы или уменьшить их длину.
    129. Misplaced conditional directive (пропущена условная директива). Компилятор обнаружил директиву {$ELSE} или {$ENDIF} без соответствующих директив {$IFDEF}, {$IENDEF} или {$IFOPT}.
    130. ENDIF directive missing (пропущена директива ENDIF). Исходный файл закончился внутри конструкции условной компиляции. В исходном файле должно быть равное количество директив {$IFxxx} и {$ENDIF}.
    131. Error in initial conditional defines (ошибка в условных определениях).
      Исходные условия компиляции, указанные в опции
      OPTIONS/COMPILER/CONDITIONAL DEFINES являются недействительными. В Турбо-Паскале разрешается не указывать условия компиляции; если же приведено несколько условий, они должны разделяться точкой с запятой.
    132. Header does not match previous definition (заголовок не соответствует
      предыдущему определению). Возможные причины сообщения:

      • Заголовок процедуры или функции, указанный в интерфейсной секции, не соответствует заголовку в исполняемой части.
      • Заголовок процедуры или функции, указанный с помощью опережающего описания (FORWARD), не соответствует заголовку найденной далее одноименной процедуры или функции.

    133. Critical disk error (критическая ошибка диска). Во время компиляции
      произошла критическая ошибка диска (например, дисковод находится в
      состоянии «не готов»).
    134. Cannot evaluate this expression (нельзя вычислить данное выражение). В
      выражении-константе или в отладочном выражении Вы пытаетесь
      использовать неподдерживаемые средства, например в описании константы
      пытаетесь использовать функцию SIN или вызвать в отладочном выражении
      определенную пользователем функцию.
    135. Expression incorrectly terminated (некорректное завершение выражения).
      Контекстуально в данном месте программы должен быть конец выражения
      или оператора.
    136. Invalid format specifier (неверный спецификатор формата). Используется
      неверный спецификатор формата или числовой аргумент спецификатора
      формата выходит за допустимые границы.
    137. Invalid indirect reference (недопустимая косвенная ссылка). Оператор пытается осуществить недопустимую косвенную ссылку. Например, Вы используете абсолютную переменную, базовая переменная которой в текущем модуле неизвестна, или используете программу типа INLINE , в которой делается ссылка на переменную, неопределенную в текущем модуле.
    138. Structured variable are not allowed here (здесь нельзя использовать переменную структурного типа). Делается попытка выполнить надпеременной структурного типа неподдерживаемую операцию. Например, Вы пытаетесь перемножить две записи.
    139. Cannot evaluate without System unit (нельзя вычислить выражение без модуля SYSTEM). Чтобы отладчик смог вычислить выражение, в файле TURBO.TPL должен содержаться модуль SYSTEM.
    140. Cannot access this symbol (нет доступа к данному символу). Как только вы скомпилируете программу, все множество её символов станет доступным. Однако к отдельным символам (например, к переменным) нельзя получить доступ, пока Вы не запустите программу.
    141. Invalid floating-point operation (недопустимая операция с плавающей запятой). При операции с плавающей запятой произошло переполнение или деление на ноль.
    142. Cannot compile overlay to memory (нельзя выполнить компиляцию оверлеев в память). Программа, использующая оверлеи, должна компилироваться на диск.
    143. Procedure or function variable expected (должна использоваться переменная процедурного типа). В этом контексте оператор получения адреса @ может использоваться только с переменной процедурного типа.
    144. Invalid procedure or function reference (недопустимая ссылка на процедуру или функцию). Возможные причины сообщения:Попытка вызова процедуры в выражении.Процедура или функция, использующая в качестве параметра вызов другой процедуры или функции, должна компилироваться в состоянии {$F+} и не
      может описываться с помощью ключевых слов INLINE или INTERRUPT .
    145. Cannot overlay this unit (этот модуль не может использоваться в качестве оверлейного). Попытка использовать в качестве оверлейного модуль, который не был скомпилирован с директивой {$О+}.
    146. Ошибки, возникающие во время выполнения программы

      Некоторые ошибки, обнаруженные во время выполнения программы, приводят к появлению на экране сообщения вида Runtime error nnn at xxxx:yyyy (ошибка времени выполнения nnn по адресу ххххгуууу), после чего программа завершает свою работу.

      Ошибки времени выполнения делятся на две категории: ошибки ввода-вывода (коды ошибок с 1 до 199) и грубые ошибки (коды ошибок с 200 до 255).

      Ошибки ввода-вывода вызывают завершение выполнения программы в случае, если оператор ввода-вывода был скомпилирован в режиме {$!+}. В режиме {$!-} продолжается выполнение программы, а ошибка возвращается функцией IORESULT. Коды ошибок 1-99 соответствуют кодам ошибок ДОС. 100-149 — ошибкам ввода вывода, 150-199 — критическим ошибкам, а 200-255 — фатальным ошибкам.

      Ошибки DOS:

      1. File not found (не найден файл). Ошибка генерируется процедурами RESET, APPEND, RENAME, или ERASE, если имя, присвоенное файловой переменной, указывает несуществующий файл.
      2. Path not found (путь не найден). Ошибка генерируется
        процедурами:
        • RESET, REWRITE, APPEND или ERASE, если имя,
        присвоенное файловой переменной, является недействительным
        или указывает на несуществующий подкаталог.
        • CHDIR, MKDIR или RMDIR, если путь является
        недействительным или указывает на несуществующий
        подкаталог.
      3. Too many open files (слишком много открытых файлов). Ошибка генерируется процедурами RESET, REWRITE или APPEND, если программа имеет слишком много открытых файлов. Операционная система ДОС не позволяет использовать более 15 открытых файлов для каждого процесса. Если Вы получили данное сообщение при наличии менее 15 открытых файлов, это может означать, что файл CONFIG.SYS не содержит параметр FILES = xxx или этот параметр задает слишком мало файлов. Увеличьте параметр FILES = xxx до какого-либо подходящего значения, например, до 20.
      4. File access defined (отказано в доступе к файлу). Данная ошибка генерируется процедурой:
        • RESET или APPEND, когда имя, присвоенное файловой
        переменной, указывает каталог или файл, доступный только для
        чтения, в то время как параметр FILEMODE файловой
        переменной содержит указание на запись данных.
        • REWRITE, если каталог заполнен или если имя, присвоенное
        файловой переменной, задает каталог или существующий файл,
        доступный только для чтения.
        • RENAME, если имя присвоенное файловой переменной,
        указывает каталог или если новое имя указывает существующий
        файл.
        • ERASE, если имя, присвоенное файловой переменной, указывает
        каталог или файл, доступный только для чтения.
        • MKDIR, если файл с тем же именем уже существует в каталоге, в
        котором создается подкаталог, и в этом каталоге нет места для
        подкаталога или путь к каталогу содержит имя логического
        устройства.
        • RMDIR, если каталог не является пустым, если путь не
        определяет каталог или если путь задает корневой каталог.
        • READ или BLOCKREAD в случае типизированного или
        нетипизированного файла, если файл не открыт для чтения.
        • WRITE или BLOCKWRITE для типизированного или
        нетипизированного файла, если этот файл не открыт для записи.
      5. Invalid file handle (недопустимый файловый канал). Данная ошибка генерируется, когда системному вызову ДОС передается недопустимый файловый канал. Эта ошибка не должна возникать в правильно работающей программе. Её появление является свидетельством того, что файловая переменная каким-либо образом испорчена.
      6. Invalid file access code (недействительный код доступа к файлам). Ошибка генерируется процедурами RESET или APPEND, если значение параметра FILEMODE в файловой переменной не является допустимым.
      7. Invalid drive number (недопустимый номер дисковода). Ошибка генерируется процедурой GETDIR, если номер дисковода не является допустимым.
      8. Cannot remove current directory (нельзя удалить текущий каталог). Ошибка генерируется процедурой RMDIR, если путь указывает текущий каталог.
      9. Cannot rename across drives (нельзя при переименовании указывать разные дисководы). Генерируется процедурой RENAME, если оба файла не находятся на одном и том же диске.

      Ошибки ввода-вывода:

      Если один из операторов компилируется с директивой {$!+}, то ошибка ввода-вывода приводит к прекращению выполнения программы. В состоянии {$!-} программа продолжает выполняться, а ошибка возвращается функцией IORESULT.

    147. Disk read error (ошибка чтения с диска). Генерируется
      процедурой READ в типизированном файле, если Вы пытаетесь
      осуществить считывание после конца файла.
    148. Disk write error (ошибка записи на диск). Ошибка генерируется процедурами CLOSE, WRITE, WRITELN, FLUSH, если диск заполнен.
    149. File not assigned (файлу не присвоено имя), ошибка генерируется процедурами RESET REWRITE , APPEND, RENAME и ERASE в случае, если файловой переменной не было присвоено имя файла с помощью обращения к процедуре ASSIGN.
    150. File not open (файл не открыт). Ошибка генерируется процедурами CLOSE, READ, WRITE, SEEK, EOF, FILEPOS, FILESIZE, FLUSH, BLOCKREAD, BLOCKWRITE, если файл не открыт.
    151. File not open for input (файл не открыт для ввода).ошибка генерируется процедурами READ, READLN, EOF, EOLN, SEEKEOF, или SEEKEOLN в текстовом файле, если файл не открыт для ввода.
    152. File not open for output (файл не открыт для вывода). Ошибка генерируется процедурами WRITE или WRITELN в текстовом файле, если файл не открыт для вывода.
    153. Invalid numeric format (неверный числовой формат). Ошибка генерируется процедурами READ или READLN, если числовое значение, считанное из текстового файла, не соответствует правильному числовому формату.
    154. Критические ошибки:

    155. Disk is write protected (диск защищен от записи).
    156. Unknown unit (неизвестный модуль).
    157. Drive not ready (дисковод находится в состоянии «не готов»).
    158. Unknown command (неопознанная команда).
    159. CRC error in data (ошибка в исходных Данных).
    160. Bad drive requiest structure length (при обращении к диску указана неверная длина структуры).
    161. Disk seek error (ошибка при операции установки головок на диске).
    162. Unknown media type (неизвестный тип носителя).
    163. Sector not found (сектор не найден).
    164. Printer out of paper (закончилась бумага на принтере)
    165. Device write fault (ошибка при записи на устройство).
    166. Device read fault (ошибка при чтении с устройства).
    167. Hardware failure (сбой аппаратуры).
    168. Фатальные ошибки:

      Грубые ошибки всегда приводят к немедленной остановке программы.

    169. Division by zero (деление на нуль).
    170. Range check error (ошибка при проверке границ). Ошибка генерируется операторами, скомпилированными в состоянии {$R+}, при возникновении одной из следующих ситуаций:
      • Индексное выражение массива находилось вне допустимого диапазона.
      • Была осуществлена попытка присвоить переменной значение, находящееся вне диапазона переменной.
      • Была осуществлена попытка передать значение, находящееся вне допустимого диапазона, в качестве параметра процедуре или функции.
    171. Stack overflow error (переполнение стека). Эта ошибка генерируется при входе в процедуру или функцию, скомпилированную в режиме {$8+}, если нет достаточной области для размещения локальных переменных программы. Увеличьте размер стека, используя директиву компилятора {$М}.
    172. Heap overflow error (переполнение кучи). Эта ошибка
      генерируется процедурами NEW или GETMEM в случае, если в
      куче не хватает памяти требуемого размера.

    173. Invalid pointer operation (недействительная операция с указателем). Эта ошибка генерируется процедурами DISPOSE или FREEMEM, когда указатель имеет значение NIL или содержит адрес, лежащий за пределами динамически распределяемой области памяти.
    174. Floating point overflow (переполнение при операции с плавающей запятой).
    175. Floating point underflow (исчезновение порядка при операции с плавающей запятой). Эта ошибка генерируется только в том случае, если используется сопроцессор 8087/80287/80387 с управляющим словом, которое демаскирует ошибку исчезновения порядка. По умолчанию исчезновение порядка приводит к возвращению результата, равного нулю.
    176. Invalid floating point operation (недопустимая операция с плавающей запятой). Возможные причины сообщения:

      • Аргумент функции TRUNC или ROUND не может быть
        преобразован в целое число, находящееся внутри диапазона типа
        LONGINT (от -2147483648 до +2147483647).
      • Отрицательный аргумент функции SQRT (извлечение квадратного корня).
      • Аргумент функции LN (логарифм) равен нулю или имеет отрицательное значение.
      • Произошло переполнение стека сопроцессора.
    177. Overlay manager not installed (не установлена подсистема управления оверлеем). Ваша программа- вызывает оверлейную процедуру или функцию, а подсистема управления оверлеем не инициализирована. Вероятнее всего в программе отсутствует обращение к процедуре OVRINIT или обращение к этой процедуре завершилось с ошибкой. Нужно иметь в виду, что если в каком-либо из оверлейных модулей содержится раздел инициализации, то в программе необходимо создать дополнительный или использовать имеющийся неоверлейный модуль, вызывающий процедуру OVRINIT в своем разделе инициализации, и указать этот модуль в предложении USES перед любым из оверлейных модулей.
    178. Overlay file read error (ошибка чтения оверлейного файла). Когда подсистема управления оверлеем пыталась считать оверлей из оверлейного файла, произошла ошибка чтения.

    Возможно, вам также будет интересно:

  • Что такое ошибка времени выполнения javascript
  • Что такое ошибка воспроизведения стрима
  • Что такое ошибка воспроизведения потока
  • Что такое ошибка воспроизведения музыки
  • Что такое ошибка воспроизведения идентификатор воспроизведения в ютубе

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии