![]() |
![]() |
C++ - Datenfelder (2) |
G.Eichelsdörfer - Staatliche Technikerschule Weilburg |
Elementtyp | Datenfeldname | [Elementeanzahl] |
---|---|---|
Der Elementtyp ist zumeist ein einfacher Datentyp. Er kann jedoch auch ein zusammengesetzter Typ sein. | Der Arrayname ist frei wählbar, unter Berücksichtigung der Namenskonvention. | Die Elementeanzahl wie auch der Indextyp müssen selbstverständlich ganzzahlig sein, z.B. int. |
Beispiele:
double Messwert[1000];
const int Anzahl = 50; // Anzahl ist eine unveränderbare int-Konstante.
int Haufigkeit[Anzahl],
Laenge[Anzahl];
Die Anzahl an Elementen eines Datenfeldes muss zur Übersetzungszeit feststehen,
weil der Compiler dafür Speicherplatz reservieren muss.
Eine Variable verändert sich zur Laufzeit eines Programmes zumeist.
Deshalb kann für die Elementeanzahl keine Variable eingesetzt werden.
Sollten sie Bedarf an einer zur Laufzeit festzulegenden Datenfeldgröße haben,
suchen Sie in einschlägiger Literatur nach "Dynamisch angelegte Datenstrukturen"
und den C++-Operatoren new
und delete
.
Noch besser sind für diese Zwecke die Container aus der Standardbibliothek geeignet.
Dazu finden Sie auch Informationen in meinem C++-Kurs.
Auf ein Element eines Arrays wird folgendermaßen zugegriffen:
Arrayname[Index]
Der Index ist ein ganzzahliger Ausdruck.
Beispiele:
Zahl[3] , Zahl[i+1] , Zahl[2*i-1] , Wert[round(f/3.6)] , Wert[Zahl[i]]
Als die Sprache C entstand, wurden Datenfelder hauptsächlich verwendet, um eine relativ große Anzahl an Werten aufzunehmen. Datenfelder wurden und werden zumeist als einfache Puffer eingesetzt, in welchen Daten zwischengespeichert werden.
Wenn eine Variable eines einfachen Datentyps als Parameter an eine Funktion übergeben wird, so erhält im Standardfall die Funktion eine Kopie dieser Variablen. Die Funktion kann dann nicht auf die Original-Variable zugreifen. Wenn ein Datenfeld als Parameter an eine Funktion übergeben wird, so wäre es in der Regel sehr aufwändig den gesamten Inhalt des Datenfeldes für die Übergabe zu kopieren. Möglicherweise gäbe es nicht einmal mehr genügend Speicherplatz dafür.
Wohl aus diesem Grund wird bei der Parameterübergabe eines Datenfeldes immer die Anfangsadresse des Datenfeldes übergeben. Die aufgerufene Funktion erhält die Referenz auf das Datenfeld und greift somit auf das Original-Datenfeld zu. Sie kann den Inhalt des Datenfeldes auch verändern.
Auszug aus einem Beispiel:
// Alle 5 min Temperatur erfassen (288 Abtastwerte je 24 Stunden). const int Abtastungen = 24 * 12; double Werte[Abtastungen]; // zur Temperaturerfassung eines Tages double max; // für die Maximaltemperatur ... einlesen(Werte, Abtastungen); // 288 Werte einlesen und in Werte ablegen // Der Funktion "einlesen" wird u.a. die Referenz auf das Array "Werte" übergeben. max = maximum(Werte, Abtastungen); // Maximum aller 288 Werte ermitteln |
Ein String ist eine Zeichenkette, er besteht aus aufeinanderfolgenden Zeichen. In C/C++ gibt es keine Sprachdefinition für einen Stringtyp. Hier ist ein String zunächst nichts anderes als ein Datenfeld aus char.
Ein solcher String kann in der Regel kleiner sein als das zur Verfügung gestellte Datenfeld.
Wenn Sie einen Namen einlesen lassen wollen, dann können Sie dessen Länge nicht voraussehen.
Dazu stellen Sie ein hinreichend großes Datenfeld zur Verfügung, beispielsweise
char Name[30];
. Der darin abgelegte Name (ein String) muss irgendwie
beendet (terminiert) sein, damit nicht das ganze Datenfeld sondern nur die darin gültigen
Zeichen verarbeitet werden. Für die Terminierung wird ein nicht druckbares Zeichen
verwendet - dasjenige mit dem Code 0 (als Zeichen: '\0'). Deshalb nennt man einen solchen
String nullterminiert.
Beispiel:
char Name[30] = "Markus";
Name enthält nun die Zeichen 'M','a','r','k','u','s','\0'(terminierendes Nullbyte).
Dahinter stehende Zeichen sind nicht gültig.
Diese Form der Stringzuweisung ist nur beim Anlegen der Stringvariablen möglich,
später nicht mehr.
Verwechseln Sie solche Strings nicht mit den vielseitigeren std::string-Objekten!