Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > setjmp/longjmp в Delphi Win32


Автор: RTJ 19.11.2023, 06:07
Можно ли на Delphi для Win32 реализовать аналоги C-функций setjmp/longjmp?

Код

type
   TJumpRec = record
      Address : Pointer;  { Адрес перехода, выполняемого LongJump. }
      ДРУГИЕ ДАННЫЕ, СОХРАНЯЕМОГО КОНТЕКСТА
   end;
var
   JumpRec : TJumpRes;

procedure GetData;
...
...
...
function GetByte( var B : Byte ) : Boolean;  { TRUE - байт получен, FALSE - данные ЗАКОНЧИЛИСЬ (ОШИБОК ВВОДА-ВЫВОДА [U]НЕ БЫЛО[/U]). }
begin
    ...
   { Нормальная ситуация - байт получен. }
   B := ...
   Result := TRUE;
   ...
   { Нормальная ситуация - байт НЕ получен. (Например, достигнут конец файла или файл пустой.) }
    Result := FALSE;
   ...
   { Ненормальная ситуация - ОШИБКА ВВОДА-ВЫВОДА (например, при чтении из файла). }
   LongJump(JumpRec)  { goto JumpRec.Address }
end; { GetByte }
...
...
...
var
   B : Byte;
label
   LabelState0, ... , LabelStateN, LabelExitOK, LabelExitERROR;
begin  { GetData }
   ...
   ИНИЦИАЛИЗАЦИЯ
   в том числе и вызов
  SetJump(JumpRec,@LabelExitERROR);
   ...
LabelState0:
    if  GetByte(B) then
      ДЕЙСТВИЯ ПРИ ПОЛУЧЕНИИ БАЙТА ДАННЫХ В СОСТЯНИИ State0,
      которые заканчиваются возможным переходом в какое-либо другое состояние (State0..StateN)
      или завершением работы (переход на метку LabelExitOK или на метку LabelExitERROR).
   else
      ДЕЙСТВИЯ СРАЗУ ПОСЛЕ ОКОНЧАНИЯ ПОЛУЧЕНИЯ ДАННЫХ (с переходом на метку LabelExitOK или на метку LabelExitERROR).
   ...
   ...
   ...
LabelStateN:
    if  GetByte(B) then
      ДЕЙСТВИЯ ПРИ ПОЛУЧЕНИИ БАЙТА ДАННЫХ В СОСТЯНИИ StateN,
      которые заканчиваются возможным переходом в какое-либо другое состояние (State0..StateN)
      или завершением работы (переход на метку LabelExitOK или на метку LabelExitERROR).
   else
      ДЕЙСТВИЯ СРАЗУ ПОСЛЕ ОКОНЧАНИЯ ПОЛУЧЕНИЯ ДАННЫХ (с переходом на метку LabelExitOK или на метку LabelExitERROR).
   ...
LabelExitOK:  { Нормальное завершение работы GetData. }
   ...
LabelExitERROR:  { Ненормальное завершение работы GetData (с какой-либо ошибкой: ОШИБКОЙ ВВОДА-ВЫВОДА или ОШИБКОЙ ВО ВХОДНЫХ ДАННЫХ). }
   ...
end { GetData }

Автор: gesper 23.11.2023, 17:00
Так вот почему программы лагают!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)