Deprecated: Function set_magic_quotes_runtime() is deprecated in /DISK2/WWW/lokiware.info/mff/wakka.php on line 35
Napsáno zpětně, podle toho, co si pamatuju z přednášky 1. 12. 2006:
program RingBuffer (input, output); { Kruhove fronte se anglicky rika ring buffer, nebo circular buffer. } const RBufSize = 8; { Staci } type RBItem = integer; { Pro ukazkove ucely jsou polozkami kruhove fronty cislicka. } RBItemPtr = ^RBItem; RBuffer = record buf : array[0..RBufSize] of RBItem; head : integer; { place for newly added items } tail : integer; { the "oldest" item } isEmpty : boolean; end; RBufferPtr = ^RBuffer; procedure RBMakeEmpty(buf : RBufferPtr); begin buf^.head := 0; buf^.tail := 0; buf^.isEmpty := TRUE; end; function RBIsFull(buf : RBufferPtr) : boolean; begin RBIsFull := (buf^.head = buf^.tail) and not buf^.isEmpty; end; function RBAddItem(buf : RBufferPtr; item : RBItem) : boolean; begin if not RBIsFull(buf) then begin buf^.buf[buf^.head] := item; buf^.head := (buf^.head+1) mod RBufSize; if buf^.isEmpty then buf^.isEmpty := FALSE; RBAddItem := TRUE; end else RBAddItem := FALSE; end; function RBGetItem(buf : RBufferPtr; item : RBItemPtr) : boolean; begin if not buf^.isEmpty then begin item^ := buf^.buf[buf^.tail]; buf^.tail := (buf^.tail+1) mod RBufSize; if buf^.tail = buf^.head then buf^.isEmpty := TRUE; RBGetItem := TRUE; end else RBGetItem := FALSE; end; var i : integer; t : RBItem; fifo : RBuffer; trash : boolean; { we assign boolean return values here, as Turbo Pascal can't ignore them } begin RBMakeEmpty(@fifo); { store and retrieve numbers 1..max } write('* test 1:'); i := 1; while RBAddItem(@fifo, i) do inc(i); while RBGetItem(@fifo, @t) do write(' ', t); writeln; writeln; { store and retrieve numbers 1..42 } write('* test 2:'); for i := 1 to 7 do trash := RBAddItem(@fifo, i); for i := 8 to 42 do begin trash := RBGetItem(@fifo, @t); write(' ', t); trash := RBAddItem(@fifo, i); end; while RBGetItem(@fifo, @t) do write(' ', t); writeln; writeln; end.