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
zurück
zu
C für PICs
, C-Compiler , PIC-Prozessoren
,
Elektronik , Homepage
Autor: sprut
erstellt: 01.10.2007
letzte Änderung: 23.10.2012