C für PICs: Arrays und Strings

 

zurück zu C für PICs , C-Compiler , PIC-Prozessoren , Elektronik , Homepage

C für PICs
Grundlagen von C
Variablen
Funktionen
Operationen
Programmablaufsteuerung
Arrays und Strings
Pointer
Strukturierte Typen
PIC-spezifisches


zurück zu C für PICs


Arrays und Strings

Wir kennen bisher einfache Typen (char, int, float) die jeweils genau einen Wert speichern können. Arrays und Strings speichern dagegen viele Werte des gleichen Typs.


Arrays

Ein Array ist eine Liste von Variablen des gleichen Typs. Deklariert wird ein Array wie folgt

typ Array_Name [Anzahl];

Dabei wird ein Array mit dem Namen "Array_Name" angelegt. Es enthält mehrere Variablen vom Typ "typ". Die Anzahl dieser Array-Elemente ist "Anzahl". In der Praxis kann das so aussehen:

int Liste [5];

Nun haben wir ein neues Array mit dem Namen "Liste". Es enthält 5 Elemente, jedes Element ist eine Variable vom Typ integer. Die Namen der Elemente lauten Liste[0], Liste[1], Liste[2], Liste[3] und Liste[4]. Um die Verwendung dieser Namen zu demonstrieren belege ich ein Elemete des Arrays mit dem Werte 2.

Liste[2] = 2;

Man hätte natürlich auch einfach 5 normale integer-Variablen deklarieren können, aber gerade die Namensgebung  mit Hilfe von Indexen eröffnet neue Möglichkeiten im Umgang mit einer großen Variablenzahl. Als Index kann man nämlich  auch eine char- oder integer-Variable verwenden. Das zeigt folgendes Beispiel, indem die 100 Elemente eines Arrays mit den Werten 0 bis 99 belegt werden.

int Liste [100];
int i;
for (i=0; i<100; i++)
    Liste[i] = i;

Hätte man anstelle des Arrays 100 einzelne Variablen deklariert, wäre das deutlich aufwendiger geworden.


In C werden die Elemente eines Arrays direkt hintereinander im Speicher abgelegt. Mit Hilde des Indexes greift man also auf eine bestimmte Speicheradresse zu, die der Compiler ausgehend vom Platz der ersten Speicherzelle und dem Index errechnet. Wenn man versehentlich einen zu großen Indexwert benutzt (z. B. versucht das sechste Element eine Arrays zu verwenden, das nur 5 Elemente hat), dann bemerkt C den Fehler nicht. Man greift auf Speicherzellen zu, die außerhalb des Arrays liegen. Ein lesender Zugriff ergibt Unsinn, während ein schreibender Zugriff irgendwelche anderen Variablen überschreibt. Aus diesem Grunde muss man das tunlichst vermeiden!

Der RAM der PIC18-Microcontroller ist in Bänken von 256 Byte organisiert. Ein Array muss immer vollständig innerhalb einer Bank liegen. Das begrenzt die Größe von Arrays für diese PICs leider.


Ein Array wird zwar fast wie eine Variable deklariert, intern stellen Arraynamen aber nur Pointer (Zeiger) auf den Anfang des Arrays im Datenspeicher dar. Deshalb kann man nicht einfach ein Array einem anderen komplett zuweisen. Ein Kopieren muss elementweise erfolgen.

int a[100], b[100];
...
a = b;                                  // FALSCH
char i;
for (i=0; i<100; i++) a[i] = b[i];      // RICHTIG



mehrdimensionale Arrays

Bisher habe ich nur sogenannte eindimensionale Arrays beschrieben. Man kann aber auch mehrdimensionale Arrays deklarieren, das sind Arrays, die als Elemente wieder Arrays enthalten. als Beispiel dient hier ein zweidimensionales Array.

int m [10][10];

Das kann man als Array betrachten, das 10 Elemente hat. Jedes dieser Elemente ist wiederum ein Array mit 10 Elementen und diese Elemente sind integer-Zahlen. Das Array beinhaltet also 100 integer-Variablen. Alternativ kann man sich das Array nun als Tabelle mit 10 Zeilen und 10 Spalten vorstellen. Jedes der 100 Felder der Tabelle ist eine integer-Variable.

Die einzelnen integer-Variablen (also Array-Elemente) adressiert man nun mit dem Arraynamen und zwei Indexen. Belegen wir mal ein Element mit 5:

m[2][4] = 5;

Man kann auch mehr als zwei Dimensionen verwenden, allerdings wächst dann der Speicherbedarf eines Arrays natürlich schnell an. Gerade in kleinen PIC-Mirkocontrollern stößt man da schnell an Grenzen.



Arrays initialisieren

Arrays lassen sich schon bei der Deklaration mit Startwerten belegen. Dazu hängt man der Deklaration eine in geschweifte Klammern eingefasste vollständige Liste von Initialisierungswerten der Arrayelemente an:

int Liste [5] = {0,1,2,3,4};
int m [4][4]  = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};




Strings

Strings sind eindimentionale char-Arrays. Sie dienen der Speicherung von Text. Ich deklariere ein Array, das einen Text von maximal 30 char-Zeichen speichern kann:

char T[30];

Die Speicherung der einzelnen Zeichen in den 30 Elementen erfolgt im ASCII-Format.

Nun kann man in so einem String auch Texte speichern, die kürzer als 30 Zeichen sind. Damit C weiß, wo der Text im String endet, wird das Array-Element, das auf das letzten gültigen Zeichen folgt, mit dem Zahlenwert 0 beschrieben. Das ist nicht das druckbare Zeichen "0", sondern ein Steuercode. Solch einen String bezeichnet man nun als "nullterminiert". In C werden stets nullterminierte Strings verwendet, es gibt dafür komfortable Funktionen. Da nun jeder String mit 0 endet, benötigt man im String auch eine Extrastelle für die abschließende 0. In den String passt nun also nur noch ein 29-Zeichen langer Text.




--> weiter zu Pointer
nach oben

zurück zu C für PICs , C-Compiler , PIC-Prozessoren , Elektronik , Homepage



Autor: sprut
erstellt: 01.10.2007
letzte Änderung: 23.10.2012