На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
  
> как отлаливать исключение в турбо паскале 7.0
    Всем программистам привет! Respect! Подскажите, а как вы отлавливате исключительные ситуации в Turbo Pascal 7.0. Например, объявил переменную целого типа, а пользователь ввел туда символ, как следсвие прога падает. В дельфи всякие try except есть, а здесь что? Подскажите как быть то?
      В Pascal нельзя никак отлавливать исключения.
        ха, что серьезно чтоли. Вот прикол :))). А как тогда программы устойчивые писать?

        Добавлено
        или это уже ложиться на плечи пользователя? Подскажите как быть то?
          Цитата FasterHarder @
          А как тогда программы устойчивые писать?

          Устойчивые к чему?
            к ошибкам. В общем понял, все ложиться на пользователя!
              пользователь?

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

                Никогда не говори - никогда :D
                Можно создать некий аналог try..except, несколько расширив стандартную возможность перехвата исключений - ExitProc:
                ExpandedWrap disabled
                  unit Except;
                   
                  interface
                  type
                    Try = record
                      _sp, _bp: Word;
                      _farptr: Pointer;
                    end;
                   
                  procedure SetExcept(var dest: Try); inline (
                  $5f/$07/$26/$89/$25/$26/$89/$6d/$02/
                  $e8/$00/$00/$58/$05/$0c/$00/$26/$89/
                  $45/$04/$26/$8c/$4d/$06);
                   
                  procedure ProceedExcept(var dest: Try); inline (
                  $5f/$07/$26/$8b/$25/$26/$8b/$6d/$02/
                  $26/$ff/$6d/$04);
                   
                  implementation
                   
                  end.

                а это пример:
                ExpandedWrap disabled
                  uses dos, crt, except;
                   
                  var
                    OldExit: Pointer;
                    exc    : Try;
                    r      : Real;
                  label
                    l;
                   
                  procedure NewExit; far;
                  begin
                    ExitProc := @NewExit;
                    ProceedExcept(exc);
                  end;
                   
                  begin
                    OldExit := ExitProc;
                    ExitProc := @NewExit;
                    repeat
                    l:
                        Writeln;
                        Write('Enter number: ');
                        SetExcept(exc);
                        Readln(r);
                        ErrorAddr := NIL;
                        SetExcept(exc);
                        if ErrorAddr <> NIL then
                          Goto l;
                        Writeln('100/',r,'= ',100.0/r);
                    until (r=1);
                    ExitProc := OldExit;
                  end.

                Данный примерчик довольно трудно уронить, он вполне спокойно обруливает неверный ввод числа, а так же деление на ноль.
                Но модуль except не идеален, его нужно немного дополнить, что бы иметь возможность восстанавливать программу даже в особо тяжелых случаях, когда важны значения всех регистров. Но для примера сойдет :)
                  AndNot, ты считаешь ЭТО (я про unit Except) Паскалем? :whistle:
                    volvo877, а почему нет? Это просто инлайн. Да и какая разница то, на чистом паскале или нет? Ошибки то отлавливает, причем очень тяжелые. Просто в Борланде предусмотрели перехват исключений, но только для завершения программы, а данный юнит исправляет эту оплошность :) Это гораздо удобнее, чем вставлять массы проверок.
                      мда, круто AndNot, буду иметь ввиду подобное.
                        FasterHarder, что бы иметь подобное - нужно знать асм и хорошо представлять себе особенности компилятора ;) Или выполняй проверки общепринятыми способами, а именно - любой ввод данных осуществляется только через строки! Это уже потом можешь перевести в число, с помощью процедуры VAL, и проанализировать результат, предотвратив падение проги.

                        FasterHarder, вот тебе пара примеров, как отлавливать некоторые ситуации, предотвращая падение проги, с пресловутой Runtime error at....
                        Ввод целых чисел:
                        ExpandedWrap disabled
                          uses dos;
                           
                          var
                            i: Integer;
                            s: String;
                            code: Integer;
                           
                          begin
                            repeat
                              Write('Enter number: ');
                              Readln(s);
                              Val(s, i, code);
                              if code > 0 then
                                Writeln('number',s,' error at ',code,' position');
                            until (code = 0);
                            Writeln('entered number: ',i);
                          end.

                        Выделение памяти:
                        ExpandedWrap disabled
                          Uses Dos;
                           
                          var
                            OldHeapError: Pointer;
                            p: Pointer;
                           
                          function NewHeapFunc(Size: Word): Integer; far;
                          begin
                            NewHeapFunc := 1;
                          end;
                           
                           
                          begin
                            OldHeapError := HeapError;
                            HeapError := @NewHeapFunc;
                            while TRUE do
                              begin
                                GetMem(p, $1000);
                                if p = NIL then
                                  begin
                                    Writeln('not enought memory');
                                    Break;
                                  end;
                              end;
                            HeapError := OldHeapError;
                          end.

                        Операции с файлами можно контролировать через IOResult.
                        Этого уже достаточно, для написания дуракоустойчивых программ.
                        Сообщение отредактировано: AndNot -
                          Спасибо AndNot большое. По поводу выделения памяти, насколько я знаю, можно ведь при выделении памяти юзать нечто(не помню, могу ошибиться): MaxAvail(максимальное количество байт досупное в ОП), MemAvail(уже не помню, типа сколько необходимо зарезервировать) :).
                            FasterHarder, MaxAvail это сколько можно получить за раз (т.е. максимальный смежный кусок), MemAvail - сколько всего свободной памяти. За раз можно получить не более MaxAvail байт.
                              Конечно можно, но перехват HeapError хорош тем, что при нехватке памяти указатель принимает значение NIL, что позволяет контролировать работу с некорректными указателями, без создания доп. функций. Особенно полезно при создании объектов.
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0661 ]   [ 15 queries used ]   [ Generated: 27.04.24, 00:44 GMT ]