Record/de: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: Record/de
| Old | New | Line | |
|---|---|---|---|
| 1 | + | Zurück zu den [[Data type/de|Datentypen]]. | |
| 2 | + | ||
| 3 | + | Ein hochstrukturierter Daten[[Type|typ]] in [[Pascal/de|Pascal]]. Im Deutschen ist für "Record" auch die Bezeichnung "Datensatz" üblich. | |
| 4 | + | ||
| 5 | + | Im Gegensatz zu einfachen Datenstrukturen wie [[Array|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. | |
| 6 | + | ||
| 7 | + | Einige Beispiele für Records: | |
| 8 | + | ||
| 9 | + | ``` pascal | |
| 10 | + | type | |
| 11 | + | ExampleRecord = record | |
| 12 | + | Values: array [0..199] of Single; | |
| 13 | + | NumValues: integer; { enthält die aktuelle Anzahl von Punkten im Array } | |
| 14 | + | Average: Single; { enthält den Mittelwert der Feldwerte des Arrays } | |
| 15 | + | end; | |
| 16 | + | ||
| 17 | + | Member = record | |
| 18 | + | Firstname, Surname: string; | |
| 19 | + | Address: array [1..3] of string; | |
| 20 | + | Phone: integer; | |
| 21 | + | Birthdate: TDateTime; | |
| 22 | + | PaidCurrentSubscription: boolean; | |
| 23 | + | end; | |
| 24 | + | ``` | |
| 25 | + | ||
| 26 | + | Ein Record wird vom Programm als eine Einheit behandelt. ZB. kann ein Record als Ganzes kopiert werden (vorausgesetzt die Kopie ist vom selben Typ): | |
| 27 | + | ||
| 28 | + | ``` pascal | |
| 29 | + | Var | |
| 30 | + | a, b: Member; | |
| 31 | + | Begin | |
| 32 | + | { weise den Feldern im Record a jetzt Werte zu } | |
| 33 | + | ... | |
| 34 | + | ... | |
| 35 | + | b := a | |
| 36 | + | End; | |
| 37 | + | ``` | |
| 38 | + | ||
| 39 | + | Auf individuelle Felder kann zugegriffen werden, indem man einen Punkt zwischen dem Recordnamen und dem Feldnamen stellt, also folgendermaßen: | |
| 40 | + | ||
| 41 | + | ``` pascal | |
| 42 | + | a.Firstname := 'George'; | |
| 43 | + | a.Surname := 'Petersen'; | |
| 44 | + | a.Phone := 789534; | |
| 45 | + | a.PaidCurrentSubscription := true; | |
| 46 | + | ``` | |
| 47 | + | ||
| 48 | + | Alternativ dazu, erreicht man sämtliche Felder auch mittels des [[With|WITH]]-Konstrukts: | |
| 49 | + | ||
| 50 | + | ``` pascal | |
| 51 | + | with a do begin | |
| 52 | + | Firstname := 'George'; | |
| 53 | + | Surname := 'Petersen'; | |
| 54 | + | Phone := 789534; | |
| 55 | + | PaidCurrentSubscription := true; | |
| 56 | + | end; | |
| 57 | + | ``` | |
| 58 | + | ||
| 59 | + | Records werden in Pascal häufig verwendet, um Datenelemente logisch zu gruppieren. | |
| 60 | + | ||
| 61 | + | ## Erweiterte Record | |
| 62 | + | ||
| 63 | + | Es ist auch möglich **procedure** und **function** in **record** zu packen. | |
| 64 | + | ||
| 65 | + | Dies muss aber mit **\$modeswitch** aktiviert werden. | |
| 66 | + | ||
| 67 | + | Der Aufbau ist etwa gleich wie bei **class** und **object**. Ein Vererben ist **nicht** möglich | |
| 68 | + | ||
| 69 | + | ``` pascal | |
| 70 | + | {$modeswitch advancedrecords} | |
| 71 | + | ||
| 72 | + | type | |
| 73 | + | MyRecord = record | |
| 74 | + | private | |
| 75 | + | a, b, c: integer; | |
| 76 | + | procedure proc; | |
| 77 | + | public | |
| 78 | + | x, y, z: single; | |
| 79 | + | function func: String; | |
| 80 | + | end; | |
| 81 | + | ``` | |
| 82 | + | ||
| 83 | + | ## Verwendung mit Case, ähnlich Union in C/C++ | |
| 84 | + | ||
| 85 | + | Mit [[Case/de|case]] im record hat man die Möglichkeit mehrere Bezeichner überschneiden zu lassen.\ | |
| 86 | + | Im folgendem Beispiel ist es so möglich auf die einzelnen Bits von **int** zu zugreifen. | |
| 87 | + | ||
| 88 | + | ``` pascal | |
| 89 | + | type | |
| 90 | + | TValue = record | |
| 91 | + | case byte of | |
| 92 | + | 0: (Int: UInt16); | |
| 93 | + | 1: (Bit: bitpacked array[0..15] of boolean); | |
| 94 | + | end; | |
| 95 | + | var | |
| 96 | + | Value: TValue; | |
| 97 | + | begin | |
| 98 | + | Value.Int := 0; | |
| 99 | + | Value.Bit[0] := True; // Bit 0 = 1 | |
| 100 | + | Value.Bit[2] := True; // Bit 2 = 4 | |
| 101 | + | ||
| 102 | + | WriteLn(Value.Int); // 1 + 4 = 5 | |
| 103 | + | end; | |
| 104 | + | ``` | |
| 105 | + | ||
| 106 | + | Siehe auch: | |
| 107 | + | ||
| 108 | + | - [[Case/de|case]] - Mehrfachauswahl | |
| 109 | + | - [[Absolute/de|absolute]] - Speicherbereich mit einem anderen Bezeichner teilen. | |
| 110 | + | ||
| 111 | + | --- | |
| 112 | + | *From the Free Pascal wiki, page "Record/de", as it stood on 2020-02-24 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* | |
| 113 | + | Category: Reserved words/de |
