home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* WARTESCH.PAS *)
- (* enthält die Funktionen zur Realisation einer *)
- (* dynamischen und einer statischen FIFO-Schlange. *)
- (* (c) 1991 Andreas Tengicki & DMV-Verlag *)
- (* ------------------------------------------------------ *)
- UNIT WarteSch;
-
- INTERFACE
-
- CONST
- FiFo_Max = 100;
-
- TYPE
- FiFo_Element = STRING;
- FiFo_Satz_Ptr = ^FiFo_Satz;
- FiFo_Satz = RECORD
- Wert : FiFo_Element;
- Next : FiFo_Satz_Ptr;
- END;
- FiFo_Array = ARRAY [0..FiFo_Max-1] OF FiFo_Element;
-
- (* --- Dynamische Version --------------------------- *)
-
- PROCEDURE FiFo_Init_d(VAR Inp, Out : FiFo_Satz_Ptr);
- PROCEDURE FiFo_In_d (VAR Inp, Out : FiFo_Satz_Ptr;
- Element : FiFo_Element);
- PROCEDURE FiFo_Out_d (VAR Inp, Out : FiFo_Satz_Ptr;
- VAR Element : FiFo_Element);
-
- (* --- Statische Version ---------------------------- *)
-
- PROCEDURE FiFo_Init_s(VAR Inp, Out : INTEGER);
- PROCEDURE FiFo_In_s (VAR Feld : FiFo_Array;
- VAR Inp, Out : INTEGER;
- Element : FiFo_Element);
- PROCEDURE FiFo_Out_s (VAR Feld : FiFo_Array;
- VAR Inp, Out : INTEGER;
- VAR Element : FiFo_Element);
-
-
- IMPLEMENTATION
-
-
- PROCEDURE FiFo_Init_d(VAR Inp, Out : FiFo_Satz_Ptr);
- (* initialisiert die dynamische FIFO-Schlange *)
- BEGIN
- Inp := NIL;
- Out := NIL;
- END;
-
- PROCEDURE FiFo_In_d(VAR Inp, Out : FiFo_Satz_Ptr;
- Element : FiFo_Element);
- (* fügt ein Element in die dyn. FIFO-Schlange *)
- VAR
- h : FiFo_Satz_Ptr;
- BEGIN
- h := inp;
- New(inp);
- Inp^.Wert := Element;
- Inp^.Next := NIL;
- IF h = NIL THEN
- Out := Inp (* 1.Element *)
- ELSE
- h^.Next := Inp; (* sonst *)
- END;
-
- PROCEDURE FiFo_Out_d(VAR Inp, Out : FiFo_Satz_Ptr;
- VAR Element : FiFo_Element);
- (* löscht ein Element aus der dyn. FIFO-Schlange. *)
- VAR
- h : FiFo_Satz_Ptr;
- BEGIN
- IF Out = NIL THEN BEGIN
- WriteLn('Fehler in der Warteschlange !!');
- Halt;
- END ELSE BEGIN
- Element := Out^.Wert;
- h := Out;
- Out := Out^.Next;
- Dispose(h);
- IF Out = NIL THEN Inp := NIL; (* letztes Element *)
- END;
- END;
-
- FUNCTION Next(Pos : INTEGER) : INTEGER;
- (* bestimmt nächsten Index bei der statischen *)
- (* FIFO-Warteschlange. *)
- BEGIN
- Next := (Pos + 1) MOD FiFo_Max;
- END;
-
- PROCEDURE FiFo_Init_s(VAR Inp, Out : INTEGER);
- (* initialisiert die statische FIFO-Schlange *)
- BEGIN
- Inp := -1;
- Out := -1;
- END;
-
- PROCEDURE FiFo_In_s(VAR Feld : FiFo_Array;
- VAR Inp, Out : INTEGER;
- Element : FiFo_Element);
- (* fügt ein Element in die stat. FIFO-Schlange *)
- BEGIN
- Inp := Next(Inp);
- IF Inp = Out THEN BEGIN
- WriteLn('Warteschlange voll !!');
- Halt;
- END ELSE BEGIN
- Feld[Inp] := Element;
- IF Out = -1 THEN
- Out := Inp (* 1.Element *)
- END;
- END;
-
- PROCEDURE FiFo_Out_s(VAR Feld : FiFo_Array;
- VAR Inp, Out : INTEGER;
- VAR Element : FiFo_Element);
- (* löscht ein Element aus der statischen FIFO-Schlange *)
- BEGIN
- IF Out = -1 THEN BEGIN (* leere Warteschlange *)
- WriteLn('Fehler in der Warteschlange !!');
- Halt;
- END ELSE BEGIN
- Element := Feld[Out];
- Out := Next(Out);
- IF Out = Next(Inp) THEN BEGIN (* letztes Element *)
- Inp := -1;
- Out := -1;
- END;
- END;
- END;
-
- END.
- (* ------------------------------------------------------ *)
- (* Ende von WARTESCH.PAS *)
-