home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* PTRARITH.PAS *)
- (* (c) 1990 Winfried Wecker & TOOLBOX *)
- (* ------------------------------------------------------ *)
- PROGRAM PTRArithmetik;
-
- USES Crt;
-
- CONST
- SizeOfINT = SizeOf(INTEGER);
- SizeOfBYTE = SizeOf(BYTE);
- HohesByte = 72 SHL 8;
-
- TYPE
- UniversalPtr = RECORD CASE INTEGER OF
- { Komplexe Datenstruktur für }
- { beliebige Zeigerarithmetik und }
- { Zugriff auf die Daten, ohne das }
- { explizite Typwandlungskonzept von }
- { Turbo-Pascal zu bemühen }
- 0 : (P : POINTER);
- 1 : (B : ^BYTE);
- 2 : (S : ^SHORTINT);
- 3 : (I : ^INTEGER);
- 4 : (W : ^WORD);
- 5 : (L : ^LONGINT);
- 6 : (C : ^CHAR);
- 7 : (Z : ^STRING);
- 8 : (V : LONGINT)
- END;
- ArithmetPtr = RECORD CASE INTEGER OF
- { Einfachere Datenstruktur nur für }
- { Zeigerarithmetik. Zugriff auf die }
- { Daten über explizite Typwandlung }
- 0 : (P : POINTER);
- 1 : (V : LONGINT)
- END;
- VAR
- Feld : ARRAY [0..95] OF INTEGER;
- x : UniversalPtr;
- y : ArithmetPtr;
- i : INTEGER;
-
- TYPE
- Mephisto = ARRAY [1..2] OF WORD;
-
- VAR
- K_M_Brandauer : UniversalPtr;
- Alter_Ego1 : WORD;
- Alter_Ego2 : WORD;
-
- PROCEDURE Nimmersatt;
- VAR
- z : CHAR;
- BEGIN
- z := ReadKey;
- IF (z = Chr(0)) THEN z := ReadKey;
- END;
-
- FUNCTION SexiSedi(x : LONGINT) : STRING;
- CONST
- Sedez : STRING = ('0123456789ABCDEF');
- VAR
- s : STRING;
- BEGIN
- s := '';
- WHILE x <> 0 DO BEGIN
- s := ConCat(Sedez[(x MOD 16) + 1], s);
- x := x SHR 4
- END;
- SexiSedi := s;
- END;
-
- PROCEDURE Ausgabe(I : INTEGER; B : BYTE; C : CHAR;
- V : LONGINT; A2, A1 : WORD);
- BEGIN
- WriteLn(SexiSedi(I):5, SexiSedi(B):6, C:6,
- SexiSedi(V):10,' ',SexiSedi(A2),':',
- SexiSedi(A1));
- END;
-
- PROCEDURE Prolog;
- BEGIN
- ClrScr;
- GotoXY(6,12);
- WriteLn('Das Programm wartet nach jeder Ausgabe auf ',
- 'beliebigen Tastendruck!');
- Nimmersatt;
- Feld[0] := 45 + HohesByte;
- FOR i := 1 TO 95 DO Feld[i] := i + 31 + HohesByte;
- END;
-
- PROCEDURE Implizit_Wortweise;
- { Zugriff über Universal-Zeigertyp }
- BEGIN
- ClrScr;
- WriteLn('Implizite Typwandlung(Universalzeiger)/',
- 'wortweise Inkrementierung');
- x.P := @Feld[16];
- WriteLn(' INT BYTE CHAR ZEIGERWERT ADRESSE');
- FOR i:=0 TO 9 DO BEGIN
- x.V := x.V + SizeOfINT; { Pointerarithmetik }
- K_M_Brandauer := x;
- Alter_Ego1 := Mephisto(K_M_Brandauer)[1];
- Alter_Ego2 := Mephisto(K_M_Brandauer)[2];
- Ausgabe(x.I^, x.B^, x.C^, x.V, Alter_Ego2, Alter_Ego1)
- END;
- END;
-
- PROCEDURE Implizit_Byteweise;
- { Zugriff über Universal-Zeigertyp }
- BEGIN
- x.P := @Feld[16];
- WriteLn('Implizite Typwandlung(Universalzeiger)/',
- 'byteweise Inkrementierung');
- WriteLn(' INT BYTE CHAR ZEIGERWERT ADRESSE');
- FOR i := 0 TO 9 DO BEGIN
- x.V := x.V + SizeOfBYTE; { Pointerarithmetik }
- K_M_Brandauer := x;
- Alter_Ego1 := Mephisto(K_M_Brandauer)[1];
- Alter_Ego2 := Mephisto(K_M_Brandauer)[2];
- Ausgabe(x.I^, x.B^, x.C^, x.V, Alter_Ego2, Alter_Ego1)
- END;
- Nimmersatt;
- END;
-
- PROCEDURE Explizit_Wortweise;
- { Zugriff über arithmet.Zeigertyp und type casting }
- BEGIN
- ClrScr;
- y.P := @Feld[16];
- WriteLn('Explizite Typwandlung(Universalzeiger)/',
- 'wortweise Inkrementierung');
- WriteLn(' INT BYTE CHAR ZEIGERWERT ADRESSE');
- FOR i := 0 TO 9 DO BEGIN
- Inc(y.V, SizeOfINT); { Pointerarithmetik }
- K_M_Brandauer.P := y.P;
- Alter_Ego1 := Mephisto(K_M_Brandauer)[1];
- Alter_Ego2 := Mephisto(K_M_Brandauer)[2];
- Ausgabe(INTEGER(y.P^), BYTE(y.P^), CHAR(y.P^),
- y.V, Alter_Ego2, Alter_Ego1);
- END;
- END;
-
- PROCEDURE Explizit_Byteweise;
- { Zugriff über arithmet.Zeigertyp und type casting }
- BEGIN
- y.P := @Feld[16];
- WriteLn('Explizite Typwandlung(Universalzeiger)/',
- 'byteweise Inkrementierung');
- WriteLn(' INT BYTE CHAR ZEIGERWERT ADRESSE');
- FOR i := 0 TO 9 DO BEGIN
- Inc(y.V, SizeOfBYTE); { Pointerarithmetik }
- K_M_Brandauer.P := y.P;
- Alter_Ego1 := Mephisto(K_M_Brandauer)[1];
- Alter_Ego2 := Mephisto(K_M_Brandauer)[2];
- Ausgabe(INTEGER(y.P^), BYTE(y.P^), CHAR(y.P^),
- y.V, Alter_Ego2, Alter_Ego1);
- END;
- Nimmersatt;
- END;
-
- PROCEDURE SeiEineZeichenkette;
- BEGIN
- ClrScr;
- GotoXY(15,10);
- WriteLn('Das Feld wird jetzt als STRING[45] ',
- 'interpretiert!');
- x.P := @Feld; { für Zugriff über implizite Typwandlung }
- GotoXY(17,11);
- WriteLn(x.Z^);
- y.P := @Feld; { für Zugriff über explizite Typwandlung }
- GotoXY(17,12);
- WriteLn(STRING(y.P^));
- Nimmersatt;
- END;
-
- PROCEDURE Epilog;
- BEGIN
- ClrScr;
- GotoXY(10,12);
- WriteLn('!!! Wie man sieht, ist alles möglich, ',
- 'auch ohne Assembler !!!');
- Nimmersatt;
- END;
-
- BEGIN
- Prolog;
- Implizit_Wortweise; { Implizite Typwandlung }
- Implizit_Byteweise; { hier: byteweises inkrementieren }
- { Zeiger(Integerfeld)! }
- Explizit_Wortweise; { Explizite Typwandlung }
- Explizit_Byteweise; { hier: byteweises inkrementieren }
- { Zeiger(Integerfeld)! }
- SeiEineZeichenkette; {Feld nun als Zeichenkette aufgefaßt}
-
- Epilog;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von PTRARITHM.PAS *)