home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1990
/
06
/
praxis
/
ptrarith.pas
< prev
Wrap
Pascal/Delphi Source File
|
1990-03-08
|
6KB
|
200 lines
(* ------------------------------------------------------ *)
(* 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 *)