1) если не вызывать ф-цию stPop (либо дважды вызывать перед ней stPush)
2) если превратить ф-ции stPop и stPush в процедуры (вырезав только result:=)
3) если подключить модуль crt, и использовать родной readkey из стандартной библиотеки crt
Собственно вопрос в том, в чём может быть дело (и есть ли грубые ошибки)? Понимаю, что моя ф-ция readkey "кривая", но если дело в ней то почему программа корректно работает в первых двух случаях ?
fpc 2.6.4
- Код: Выделить всё
- {$MODE OBJFPC}
 program main;
 //uses crt;
 uses keyboard;
 
 type
 PList = ^TList;
 
 TList = record
 Data: byte;
 prev: PList;
 Next: PList;
 end;
 
 var
 c:char;
 dat:byte;
 st:Plist;
 
 function readkey(iswait: boolean = False): char;
 var
 key: tkeyevent;
 begin
 if iswait = True then
 Key := PollKeyEvent;
 if key <> 0 then
 begin
 Key := GetKeyEvent;
 Key := TranslateKeyEvent(Key);
 end;
 Result := GetKeyEventChar(Key);
 end;
 
 function stEmpty(aList: Plist): boolean;
 begin
 Result := (aList = nil);
 end;
 
 function stPush(var aList: PList; aData: byte): PList;
 var
 p: PList;
 begin
 new(p);
 p^.Data := aData;
 p^.prev := aList;
 alist := p;
 Result := p;
 end;
 
 function stPop(var aList: PList; var aData: byte): PList;
 var
 p: PList;
 begin
 Result := nil;
 if stEmpty(aList) then
 exit;
 
 p := alist;
 alist := alist^.prev;
 Result := p^.prev;
 dispose(p);
 
 end;
 
 
 
 begin
 initkeyboard;
 stPop(st,dat);
 
 repeat
 c:=readkey;
 //------
 until c=#27;
 
 
 
 end.




 Проверка значения неинициализированной переменной.
  Проверка значения неинициализированной переменной.
