![]() |
![]() |
C++ - Datenverbunde, Structs |
G.Eichelsdörfer - Staatliche Technikerschule Weilburg |
Am Anfang dieses Kapitels gab es mehrere Beispiele außerhalb einer Programmiersprache. Das fünfte Beispiel, ein Diabolo, zeigt auf, dass ein Gegenstand häufig aus verschiedenen Teilen zusammengesetzt ist. Ein weiteres Beispiel ist ein Widerstand - ein elektronisches Bauelement. Er besitzt einen Widerstandswert, eine Belastbarkeit (Leistung), eine Bauform, eine Toleranz, Abmessungen (Länge, Breite, Höhe) und innerhalb eines Schaltplans eine Bezeichnung, beispielsweise "R12".
Ein Computerprogramm soll oftmals einen oder mehrere Gegenstände (Objekte) modellieren,
d.h. die wichtigsten Eigenschaften solcher Gegenstandes verarbeiten.
Mithilfe eines solchen Modells kann ein Computer das Verhalten des Objektes nachbilden.
Jede Computersimulation (Fahr- und Flugsimulator, Actionspiele, ...) verwendet solche Modelle.
Weil ein modelliertes Objekt fast immer aus verschiedenen Teilen zusammengesetzt ist,
haben wir es dabei immer mit einer Datenstruktur zu tun, die einzelne Daten verschiedener Typen
beinhalten muss. Eine solche Datenstruktur fasst alle einzelnen Daten eines Objektes zusammen
und wird Verbund genannt.
Ein Datenfeld kann hierfür nicht verwendet werden, weil es ausschließlich Daten eines einzigen Typs zusammenfassen kann. In C und C++ heißt ein Verbund kurz "struct", von Struktur. In Pascal wird er "Record" genannt. Ein Struct wird erst zum Datentyp, wenn dargelegt wird, welche Bestandteile darin zusammengefasst werden.
Beispiel Widerstand: | ||
---|---|---|
struct Resistor
|
Hier wird ein Struct-Typ ausschließlich deklariert. Erst nach der Deklaration eines Struct-Typs kann dieser Typ verwendet werden, wie zur Definition von Variablen oder als Parametertyp für Funktionen. |
Wert, Belastbarkeit und Bezeichnung sind die Komponenten des Struct-Typs Resistor. Jede Komponente wird genauso angegeben wie eine Variable definiert wird.
Die Deklaration eines Structs muss die folgende Form besitzen.
struct Typname
|
Das Schlüsselwort struct, die geschweiften Klammern, das Semikolon am Ende und die Struktur sind fest vorgeschrieben. Den Namen des Struct-Typs und alle Komponenten können Sie selbst nach Bedarf wählen. |
Wenn ein Typ deklariert wird, wird keine Variable angelegt und somit im Programm auch kein Speicherplatz belegt. Erst mit der Definition einer Variablen eines solchen strukturierten Typs wird die Variable angelegt und somit Speicherplatz belegt.
Beispiel Widerstand: | ||
---|---|---|
Resistor R;
|
R ist somit eine zusammengesetzte Variable mit den Komponenten Wert, Belastbarkeit und Bezeichnung. |
In C muss vor dem Typnamen noch das Wort struct stehen (struct Resistor R;
).
Einer Variablen müssen Werte zugeordnet und diese Werte müssen gelesen werden können. Bei einer strukturierten Variablen erfolgt dies über den Zugriff auf die einzelnen Komponenten. Um auf den Wert unseres Widerstandes zuzugreifen, muss sowohl der Name der zusammengesetzten Variablen (hier R) als auch der Name der Komponente (hier Wert) angegeben werden. Hierzu wird in C/C++ wie auch in anderen Programmiersprachen die Punkt-Notation verwendet.
Soll unserem R der Wert 5,6 Ohm zugeordnet werden, so schreiben wir
R.Wert = 5.6;
|
allgemeine Form: Struct-Variable.Komponente - ohne Leerzeichen(!) Der Punkt ist also nicht immer ein Dezimalpunkt. |
Eine Komponente kann ansonsten genauso verwendet werden wie eine einfache Variable.
Wenn der Wert des Widerstandes um 5% steigen soll, so schreiben wir
R.Wert *= 1.05;
oder
R.Wert = R.Wert*1.05;
Um beispielsweise dem Widerstand den Namen "R12" zu geben, notieren wir
R.Bezeichnung = "R12";
Eine Funktion kann einen Struct als Parameter importieren und/oder einen Struct als Resultat liefern. Ein Struct kann als Komponente einen Struct besitzen. Ein Datenfeld kann Structs beinhalten, selbstverständlich nur vom selben Typ. Alles ist möglich ;-)