zurück weiter

C++ - Datenfelder (2)

G.Eichelsdörfer - Staatliche Technikerschule Weilburg

Syntax einer Datenfeld-Definition

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.

Syntax eines Zugriffs auf ein Element eines Datenfeldes

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]]

Übergabe eines Datenfeldes als Parameter an eine Funktion

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

Hinweis zu nullterminierten Strings, aus der Spache C übernommen

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!