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.