Difference between revisions of "Record/de"
m |
m (Fixed syntax highlighting) |
||
(16 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
{{Record}} | {{Record}} | ||
+ | |||
+ | |||
+ | Zurück zu den [[Data type/de|Datentypen]]. | ||
+ | |||
Ein hochstrukturierter Daten[[Type|typ]] in [[Pascal/de|Pascal]]. Im Deutschen ist für "Record" auch die Bezeichnung "Datensatz" üblich. | Ein hochstrukturierter Daten[[Type|typ]] in [[Pascal/de|Pascal]]. Im Deutschen ist für "Record" auch die Bezeichnung "Datensatz" üblich. | ||
Line 7: | Line 11: | ||
Einige Beispiele für Records: | Einige Beispiele für Records: | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang=pascal> |
− | + | type | |
− | ExampleRecord = | + | ExampleRecord = record |
− | + | Values: array [0..199] of Single; | |
− | + | NumValues: integer; { enthält die aktuelle Anzahl von Punkten im Array } | |
− | + | Average: Single; { enthält den Mittelwert der Feldwerte des Arrays } | |
− | + | end; | |
− | Member = | + | Member = record |
− | + | Firstname, Surname: string; | |
− | + | Address: array [1..3] of string; | |
− | + | Phone: integer; | |
− | + | Birthdate: TDateTime; | |
− | + | PaidCurrentSubscription: boolean; | |
− | + | end; | |
</syntaxhighlight> | </syntaxhighlight> | ||
− | Ein Record wird vom Programm als eine Einheit behandelt. | + | Ein Record wird vom Programm als eine Einheit behandelt. ZB. kann ein Record als Ganzes kopiert werden (vorausgesetzt die Kopie ist vom selben Typ): |
− | <syntaxhighlight> | + | <syntaxhighlight lang=pascal> |
− | Var a, b : Member; | + | Var |
+ | a, b: Member; | ||
Begin | Begin | ||
− | { weise den Feldern im Record a jetzt Werte zu} | + | { weise den Feldern im Record a jetzt Werte zu } |
... | ... | ||
... | ... | ||
Line 37: | Line 42: | ||
Auf individuelle Felder kann zugegriffen werden, indem man einen Punkt zwischen dem Recordnamen und dem Feldnamen stellt, also folgendermaßen: | Auf individuelle Felder kann zugegriffen werden, indem man einen Punkt zwischen dem Recordnamen und dem Feldnamen stellt, also folgendermaßen: | ||
− | <syntaxhighlight> | + | |
− | a. | + | <syntaxhighlight lang=pascal> |
− | a. | + | a.Firstname := 'George'; |
− | a. | + | a.Surname := 'Petersen'; |
− | a.PaidCurrentSubscription := | + | a.Phone := 789534; |
+ | a.PaidCurrentSubscription := true; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Alternativ dazu, erreicht man sämtliche Felder auch mittels des [[With|WITH]]-Konstrukts: | Alternativ dazu, erreicht man sämtliche Felder auch mittels des [[With|WITH]]-Konstrukts: | ||
− | <syntaxhighlight> | + | |
− | + | <syntaxhighlight lang=pascal> | |
− | + | with a do begin | |
− | + | Firstname := 'George'; | |
− | + | Surname := 'Petersen'; | |
− | + | Phone := 789534; | |
− | + | PaidCurrentSubscription := true; | |
− | PaidCurrentSubscription := | + | end; |
− | end; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Records werden in Pascal häufig verwendet, um Datenelemente logisch zu gruppieren. | Records werden in Pascal häufig verwendet, um Datenelemente logisch zu gruppieren. | ||
+ | |||
+ | ==Erweiterte Record== | ||
+ | |||
+ | Es ist auch möglich '''procedure''' und '''function''' in '''record''' zu packen. | ||
+ | |||
+ | Dies muss aber mit '''$modeswitch''' aktiviert werden. | ||
+ | |||
+ | Der Aufbau ist etwa gleich wie bei '''class''' und '''object'''. Ein Vererben ist '''nicht''' möglich | ||
+ | |||
+ | <syntaxhighlight lang=pascal> | ||
+ | {$modeswitch advancedrecords} | ||
+ | |||
+ | type | ||
+ | MyRecord = record | ||
+ | private | ||
+ | a, b, c: integer; | ||
+ | procedure proc; | ||
+ | public | ||
+ | x, y, z: single; | ||
+ | function func: String; | ||
+ | end; | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Verwendung mit Case, ähnlich Union in C/C++== | ||
+ | |||
+ | Mit [[Case/de|case]] im record hat man die Möglichkeit mehrere Bezeichner überschneiden zu lassen.<br> | ||
+ | Im folgendem Beispiel ist es so möglich auf die einzelnen Bits von '''int''' zu zugreifen. | ||
+ | |||
+ | <syntaxhighlight lang=pascal> | ||
+ | type | ||
+ | TValue = record | ||
+ | case byte of | ||
+ | 0: (Int: UInt16); | ||
+ | 1: (Bit: bitpacked array[0..15] of boolean); | ||
+ | end; | ||
+ | var | ||
+ | Value: TValue; | ||
+ | begin | ||
+ | Value.Int := 0; | ||
+ | Value.Bit[0] := True; // Bit 0 = 1 | ||
+ | Value.Bit[2] := True; // Bit 2 = 4 | ||
+ | |||
+ | WriteLn(Value.Int); // 1 + 4 = 5 | ||
+ | end; | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Siehe auch: | ||
+ | |||
+ | *[[Case/de|case]] - Mehrfachauswahl | ||
+ | *[[Absolute/de|absolute]] - Speicherbereich mit einem anderen Bezeichner teilen. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | [[Category:Reserved words/de]] | ||
+ | {{Data_types/de}} |
Latest revision as of 04:51, 24 February 2020
│
Deutsch (de) │
English (en) │
español (es) │
suomi (fi) │
français (fr) │
magyar (hu) │
polski (pl) │
português (pt) │
русский (ru) │
Zurück zu den Datentypen.
Ein hochstrukturierter Datentyp in Pascal. Im Deutschen ist für "Record" auch die Bezeichnung "Datensatz" üblich.
Im Gegensatz zu einfachen Datenstrukturen wie Arrays oder Sets, die aus lauter Elementen desselben Typs bestehen, kann ein Record aus einer Anzahl von Elementen aus unterschiedlichen Typen bestehen, und kann dadurch eine hohe Komplexität erreichen. Ein einzelner Teil eines Records wird als Feld (Field) bezeichnet.
Einige Beispiele für Records:
type
ExampleRecord = record
Values: array [0..199] of Single;
NumValues: integer; { enthält die aktuelle Anzahl von Punkten im Array }
Average: Single; { enthält den Mittelwert der Feldwerte des Arrays }
end;
Member = record
Firstname, Surname: string;
Address: array [1..3] of string;
Phone: integer;
Birthdate: TDateTime;
PaidCurrentSubscription: boolean;
end;
Ein Record wird vom Programm als eine Einheit behandelt. ZB. kann ein Record als Ganzes kopiert werden (vorausgesetzt die Kopie ist vom selben Typ):
Var
a, b: Member;
Begin
{ weise den Feldern im Record a jetzt Werte zu }
...
...
b := a
End;
Auf individuelle Felder kann zugegriffen werden, indem man einen Punkt zwischen dem Recordnamen und dem Feldnamen stellt, also folgendermaßen:
a.Firstname := 'George';
a.Surname := 'Petersen';
a.Phone := 789534;
a.PaidCurrentSubscription := true;
Alternativ dazu, erreicht man sämtliche Felder auch mittels des WITH-Konstrukts:
with a do begin
Firstname := 'George';
Surname := 'Petersen';
Phone := 789534;
PaidCurrentSubscription := true;
end;
Records werden in Pascal häufig verwendet, um Datenelemente logisch zu gruppieren.
Erweiterte Record
Es ist auch möglich procedure und function in record zu packen.
Dies muss aber mit $modeswitch aktiviert werden.
Der Aufbau ist etwa gleich wie bei class und object. Ein Vererben ist nicht möglich
{$modeswitch advancedrecords}
type
MyRecord = record
private
a, b, c: integer;
procedure proc;
public
x, y, z: single;
function func: String;
end;
Verwendung mit Case, ähnlich Union in C/C++
Mit case im record hat man die Möglichkeit mehrere Bezeichner überschneiden zu lassen.
Im folgendem Beispiel ist es so möglich auf die einzelnen Bits von int zu zugreifen.
type
TValue = record
case byte of
0: (Int: UInt16);
1: (Bit: bitpacked array[0..15] of boolean);
end;
var
Value: TValue;
begin
Value.Int := 0;
Value.Bit[0] := True; // Bit 0 = 1
Value.Bit[2] := True; // Bit 2 = 4
WriteLn(Value.Int); // 1 + 4 = 5
end;
Siehe auch:
Datentypen | |
---|---|
Einfacher Datentyp | Boolean | Byte |Cardinal | Char | Currency | Extended | Int64 | Integer | Longint | Pointer | Real | Shortint | Smallint | Word |
Zusammengesetzter Datentyp | Array | Class | Record | Set | String | ShortString |