Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.15.63.145] |
|
Сообщ.
#1
,
|
|
|
Всем программистам привет! Respect! Подскажите, а как вы отлавливате исключительные ситуации в Turbo Pascal 7.0. Например, объявил переменную целого типа, а пользователь ввел туда символ, как следсвие прога падает. В дельфи всякие try except есть, а здесь что? Подскажите как быть то?
|
Сообщ.
#2
,
|
|
|
В Pascal нельзя никак отлавливать исключения.
|
Сообщ.
#3
,
|
|
|
ха, что серьезно чтоли. Вот прикол )). А как тогда программы устойчивые писать?
Добавлено или это уже ложиться на плечи пользователя? Подскажите как быть то? |
Сообщ.
#4
,
|
|
|
Цитата FasterHarder @ А как тогда программы устойчивые писать? Устойчивые к чему? |
Сообщ.
#5
,
|
|
|
к ошибкам. В общем понял, все ложиться на пользователя!
|
Сообщ.
#6
,
|
|
|
пользователь?
тут все ложиться на программера, который вставляет всевозможные проверки чтобы избежать ошибок в программе при некорректном вводе информации пользователем. |
Сообщ.
#7
,
|
|
|
Цитата SkyStar @ В Pascal нельзя никак отлавливать исключения. Никогда не говори - никогда Можно создать некий аналог try..except, несколько расширив стандартную возможность перехвата исключений - ExitProc: 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. а это пример: 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 не идеален, его нужно немного дополнить, что бы иметь возможность восстанавливать программу даже в особо тяжелых случаях, когда важны значения всех регистров. Но для примера сойдет |
Сообщ.
#8
,
|
|
|
AndNot, ты считаешь ЭТО (я про unit Except) Паскалем?
|
Сообщ.
#9
,
|
|
|
volvo877, а почему нет? Это просто инлайн. Да и какая разница то, на чистом паскале или нет? Ошибки то отлавливает, причем очень тяжелые. Просто в Борланде предусмотрели перехват исключений, но только для завершения программы, а данный юнит исправляет эту оплошность Это гораздо удобнее, чем вставлять массы проверок.
|
Сообщ.
#10
,
|
|
|
мда, круто AndNot, буду иметь ввиду подобное.
|
Сообщ.
#11
,
|
|
|
FasterHarder, что бы иметь подобное - нужно знать асм и хорошо представлять себе особенности компилятора Или выполняй проверки общепринятыми способами, а именно - любой ввод данных осуществляется только через строки! Это уже потом можешь перевести в число, с помощью процедуры VAL, и проанализировать результат, предотвратив падение проги.
FasterHarder, вот тебе пара примеров, как отлавливать некоторые ситуации, предотвращая падение проги, с пресловутой Runtime error at.... Ввод целых чисел: 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. Выделение памяти: 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. Этого уже достаточно, для написания дуракоустойчивых программ. |
Сообщ.
#12
,
|
|
|
Спасибо AndNot большое. По поводу выделения памяти, насколько я знаю, можно ведь при выделении памяти юзать нечто(не помню, могу ошибиться): MaxAvail(максимальное количество байт досупное в ОП), MemAvail(уже не помню, типа сколько необходимо зарезервировать) .
|
Сообщ.
#13
,
|
|
|
FasterHarder, MaxAvail это сколько можно получить за раз (т.е. максимальный смежный кусок), MemAvail - сколько всего свободной памяти. За раз можно получить не более MaxAvail байт.
|
Сообщ.
#14
,
|
|
|
Конечно можно, но перехват HeapError хорош тем, что при нехватке памяти указатель принимает значение NIL, что позволяет контролировать работу с некорректными указателями, без создания доп. функций. Особенно полезно при создании объектов.
|