Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

1 - Indexierte Feldvariable

Häufig werden for-Schleifen bei Feldvariablen eingesetzt. Mit ihr gelingt es sehr einfach die indexierten Feldvariablen einzeln anzusprechen.

Übung 1

 

  • Gib das Programm A10_01.c ein und speicher es mit  Save Project As ab.
  • Start das Programm mit  Run Project with Terminal und überprüfe, ob alle Feldvariablen auf dem Terminal ausgegeben werden.

 

 

Programm A10_01.c

Programm A10_01.c

Wie arbeitet das Programm A10_01.c?

 

Zeile 9
Das Hauptprogramm initialisiert zu Beginn ein Feld "p" mit sechs Elementen: 1 und die ersten fünf Primzahlen.


Zeile 10
Die for-Schleife startet mit den Parametern: Startwert: i=0, Bedingung: i<6 und Inkrement: i++

.  
Zeile 12
Die print-Anweisung gibt bei jedem Schleifendurchlauf die angesprochene Feldvariable mit dem ihr zugewiesenen Wert aus. Beim ersten Schleifendurchlauf wird aus:

 

  • print("p[%d] = %d\n", i, p[i]) -> print("p[%d] = %d\n", 0, p[0]);

 

auf dem SimpleIDE Terminal erscheint p[0] = 1.


Der zweite Schleifendurchlauf ergibt:

  • print("p[%d] = %d\n", 1, p[1]).

 

Die for-Schleife zählt bis zur Zahl 5 hoch und stellt alle Werte, die in den Feldvariablen abgelegt waren, auf dem Terminal dar. Das letzte Element ist p[5] = 11.

 

Was du wissen solltest!

sizeof

C verfügt über einen unitären Operator sizeof, der die Bytezahl auswirft, die von einem Objekt, wie zum Beispiel einem Array, im Speicher benötigt wird.

Im letzten Beispielprogramm wussten wir, dass das Feld 5 Elemente enthält und wählten als Schleifenbedingung i < 6, um auf alle Feldelemente zugreifen zu können. Wie müssen wir vorgehen, wenn wir die Anzahl der Feldelemente nicht kennen? Das folgende Beispiel zeigt eine Lösung:

  • for(int i = 0; i < sizeof(p)/sizeof(int); i++)
    
sizeof(p) gibt die Gesamtspeicherzahl in Bytes des Feldes p an, sizeof(int) gibt die Bytes an, die von einem Feldelement benötigt werden. Dann gibt der Quotient: sizeof(p)/sizeof(int)  die Zahl der Elemente in einem Feld an.

Übung 2

 

  • Speicher das letzte Programm unter dem Namen A10_02.
  • Füge in das p-Feld des Arrays weitere Primzahlen ein.
  • Veränder die for- Schleife mit Hilfe des Operators sizeof, um die Zahl der Feldelemente zu bestimmen.
  • Starte das Programm über Run with Terminal und überzeuge dich, dass es korrekt läuft.

 

Übung 3

 

Schreibe ein Programm, das jedes Feldelement mit 100 multipliziert und das Ergebnis in die Feldvariablen zurückschreibt. Gib in einer zweiten Schleife alle Feldinhalte auf dem Terminal aus. Wenn keine Fehler gemacht wurden, sollte die zweite Schleife die Werte: 100, 200, 300, 500, 700, 1100, etc. anzeigen.

 

Variablenwerte und Adressen

Bisher hat uns nur interessiert, welche Werte in Variablen abgespeichert sind. Es gibt aber eine Reihe von nützlichen Funktionen in der Sprache C++, die gerne wüssten, wo die Werte einer Variablen innerhalb des RAM (Random Access Memory) abgelegt wurden.


Um uns nun auf die folgenden Übungen vorzubereiten, die diese Funktionen benutzen, schauen wir uns erst einmal an, wie man die Adresse einer Variablen innerhalb des RAM bestimmt. Dies erfolgt durch das Voranstellen des Operators & beim Variablennamen.

 

Übung 4

 

  • Gib das folgende Programm ein und speicher es unter A11_01 ab.
  • Starte das Programm und notiere die im Terminal ausgegebene Adresse.

 

 

Programm A11_01.c

Programm A11_01.c
Terminalausgabe zu Programm A11_01.c

In dem folgenden Testprogramm wird der int Variablen mit Namen Variable der Wert 123 zugewiesen. Die Adresse, unter der dieser Wert im RAM abgelegt wird, erscheint im Terminal. Anschließend wird der Variablen ein neuer Wert zugewiesen und im Terminal wiederum die RAM-Adresse ausgegeben.

 

Übung 5

 

  • Gib das Programm A11_02 ein und speicher es mit  Save Project As ab.
  • Start das Programm mit  Run Project with Terminal und notiere dir die im Terminal ausgegebenen Adressen der Variablen.

 

 

Programm A11_02.c

Programm A11_02.c

 

 

Wie arbeitet das Programm A11_02.c?

 

Zeile 9
Das Programm startet mit der Deklaration einer int-Variablen mit Namen Variable und weist ihr den Initialisierungswert 123 zu.

 

Zeile 10 und 11
Der erste print Aufruf gibt den Wert aus. Die Adresse unter der dieser Wert im RAM abgelegt wurde, wird über &variable erreicht. Die Adresse gibt die Anzahl Bytes an gezählt vom Beginn des Haupt-RAM.  

 

Zeile 12
Nach einer neuen Zuweisung an die Variable variable wird in …


Zeile 13 und 14
der neu zugewiesene Wert und in einer weiteren Zeile die neue Adresse der Variablen ausgegeben. Die neue Adresse der Variablen ist die alte.

 

Terminalausgabe zu Programm A11_02.c
Was du wissen solltest!

Die Adressen im Haupt RAM des Propeller werden als Byte-Adressen angegeben; sie geben an, um wie viel Bytes vom Beginn des Haupt-RAM- Bereichs die Adresse liegen. Diese Art der Darstellung gilt für die Datentypen INT, SHORT, BYTE und FLOAT.

Mit dem &-Operator lassen sich auch die Adressen von Feldvariablen bestimmen. Gegeben sei das folgende Array:

int array[5] = {11, 13, 17, 19, 23};

Die Ermittlung der Adresse des dritten Feldelementes (enthält die Zahl 19!) wird auch hier durch das Voranstellen des &-Operators eingeleitet:

print("array[3] address = %d \n", &array[3]);

Die Ermittlung der Adresse des nullten Feldelements (enthält die Zahl 11) kann auf zweierlei Art angegangen werden: entweder durch das Voranstellen des &-Operators oder durch den Aufruf des Feldnamens. Hier die beiden Darstellungen:

print("array[0] address = %d \n", &array[0]);
print("array[0] address = %d \n",  array);

Jedes Feldelement in einem Array vom Typ int benötigt 4 Bytes. Die Adresse eines zweiten Elementes ist also immer um 4 höher als die des ersten Elementes und so weiter. Char-Felder, bei denen jedes Element nur ein Byte benötigt, unterscheiden sich deshalb von den int-Feldern

 

Wir überprüfen, ob jedes Feldelement vom Typ int tatsächlich vier Bytes benötigt und das die Startadresse eines Feldes auch über &array[0] aufgerufen werden kann.

 

 

Übung 6

 

  • Speicher das letzte Programm unter dem neuen Namen A11_03 ab.
  • Änder das Programm so ab, wie unten dargestellt.
  • Starte das Programm und überprüfe die Darstellung im Teminalfenster.

 

 

Programm A11_03.c

Programm A11_03.c
Terminalausgabe zu Programm A11_03.c
TIPP: Die Adressausgabe des ersten Feldelementes wird häufig nur über den Feldnamen-Aufruf array statt über &array[0] initiiert.

Jetzt kommst du!

 

Im dieser Lektion wurde erwähnt, dass ein Feld vom Typ char pro Feldelement ein Byte benötigt. Das soll mit der folgenden Aufgabe überprüft werden.

  • Speicher das Programm A11_03 unter dem neuen Namen A11_04 ab und veränder es. Benutze statt eines Feldes vom Typ int ein Feld vom Typ char und überzeuge dich, dass tatsächlich nur ein Byte pro Element benötigt wird.

 

Kommentar schreiben

Kommentare

  • olaf (Sonntag, 10. Dezember 2017 08:35)

    wow...die mit Abstand beste Site, die ich bisher zu diesem Thema gesehen habe :-))
    Vielen Dank dafür. Hilft super beim Erklären!!

  • David Eisenblätter (Sonntag, 11. Februar 2018 13:38)

    Sehr schön erklärt, und zufällig heute, wo ich nochmal nach einer detailierten Gedankenstütze diesbezüglich gesucht habe!

    Vielen vielen Dank!

    David.

Bitte geben Sie den Code ein
* Pflichtfelder
Druckversion Druckversion | Sitemap
© Reinhard Rahner - Gettorf