- Objektorientierung
- Programmbibliotheken (Libraries))
- Variablen
- Operatoren
- Programmablauf
- Prozeduren und Funktionen
- Programmaufbau
Online Bücher / Tutorials zu C / C++
- C++ Programmierung (WikiBooks)
- C++ Tutorial (english)
Der objektoriente Ansatz versucht, die den Problemen der Welt zugrundeliegende Komplexität durch Abstraktion unseres Wissens und Kapselung dieses Wissens in Objekten überschaubar zu machen.
Was ist ein Objekt?
- Ein Objekt bildet, in der Regel, Dinge der Realen Welt ab, z.B. Auto, Kontaktstift (GPIO Pin), Sensor, Aktor
- Ein Objekt kapselt Methoden (Verhalten) und Attribute (Daten)
- Ein Objekt kann andere Objekte beinhalten, z.B. Auto beinhaltet Temperatursensor, Motor etc.
- Ein Objekt kann mehrfach Instanziert werden, z.B. für GPIO Pin D2, D3, D4 etc.
- Objekte werden in Klassen definiert
- Ein oder mehrere Klassen werden in Programmbibliotheken (Libraries) zusammenfasst
- Klassen Definitionen werden in Dateien mit der Endung .h abgelegt
- Klassen Implementierungen werden in Dateien mit der Endung .cpp abgelegt.
Beispiele Objekte:
DigitalOut led1( D10 ); // Instanzieren eines Objektes mit dem Namen led1 anhand der Klasse DigitalOut, als Pin (Daten) wird D10 übergeben.
DigitalOut led2( D11 ); // Gleiche Klasse (DigitalOut), neues Objekt, neuer Name (led2) und andere Daten (D11)
led1.write( 1 ); // Aufruf der Methode write mit Wert 1, welches die LED zum Leuchten bringt.
led2.write( 0 );
// Kurzform
led1 = 1;
led2 = 0;
AnalogIn light( A0 ); // Instanzieren eines Objektes mit dem Namen light anhand der Klasse AnalogIn, als Pin (Daten) wird A0 übergeben
light.read(); // Auslesen des aktuellen Analogen Wertes an Pin A0, mittels der Methode read()
Motor motor1( D3, D2, D4 ); // Instanzieren Motor Objekt
motor1.speed( 0.5 ); // Setzen der Geschwindigkeit des Motors
Ein oder mehrere Klassen werden in Programmbibliotheken (Libraries) zusammenfasst.
Programmbibliotheken (Libraries) werden, von der mbed Plattform (IDE, Compiler), in Repositories gespeichert.
Beispiel Klassen und Programmbibliotheken (Libraries)
- mbed-os ist eine Programmbibliothek (Library) welche die Grundklassen der mbed Plattform beinhaltet
- IoTKit ist die Programbibliothek des IoTKits mit u.a. Definition der IoTKits-Pins.
- AnalogIn, DigitalOut etc. sind Klassen.
Weitere Beispiele siehe mbed Komponenten Verzeichnis
- Variablen dienen zum Zwischenspeichern von Ganz-, Gleitkommazahlen oder Zeichen.
- Variablen haben einen Namen
- Der durch eine Variable repräsentierte Wert kann zur Laufzeit des Programmes verändert werden.
- Mehrere Variablen desselben Typs können zu einem Array (im Deutschen bisweilen auch Datenfeld oder Vektor genannt) zusammenfasst werden.
- Zusätzlich kennt C struct, welches verschiedene Komponenten zu Strukturen (Records) zusammenfasst. Der Zugriff auf die Felder erfolgt mittels ".", Beispiel myStruct.data.
int i; // Definition Ganzzahl ohne Initialwert
int x = 4; // Definition Ganzzahl mit Initialwert 4
float v = 4.1f; // Definition Gleitkommazahlen mit Initialwert 4.1
int feld[10]; // Anlegen ohne Initialisierung
int feld[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // Mit Initialisierung (automatisch 10 Elemente)
int feld[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // Fehleranfällig, weil der Compiler ein 11tes Element nicht als Fehler erkennt
char host[] = "mbed-myboard"; // Zeichenkette es wird automatisch ein Hex 0 als Abschluss angefügt
struct
{
int pin;
char data[4];
float servo;
} myStruct;
Typ | Speicherplatz | Wertebereich (dezimal) |
---|---|---|
char | 1 Byte | -128 bis +127 bzw. 0 bis 255 |
signed char | 1 Byte | -128 bis +127 |
unsigned char | 1 Byte | 0 bis 255 |
short | 2 Byte | -32768 bis +32767 |
unsigned short | 2 Byte | 0 bis 65535 |
int | 4 Byte | -2147483648 bis +2147483647 |
unsigned int | 4 Byte | 0 bis 4294967295 |
long | 4 Byte | -2147483648 bis +2147483647 |
unsigned long | 4 Byte | 0 bis 4294967295 |
Typ | Speicherplatz | Wertebereich | kleinste positive Zahl | Genauigkeit |
---|---|---|---|---|
float | 4 Byte | 6 Stellen | ||
double | 8 Byte | 12 Stellen | ||
long double | 10 Byte | 18 Stellen |
- Es gibt zwei Arten von Operatoren: Mathematische und Logische
- Das Ergebnis eines Mathematischen Operators ist immer eine Zahl
- Das Ergebnis eines Logischen Operators ist "wahr" oder "unwahr"
- Logische Operatoren kommen bei Bedingungen zum Einsatz (siehe Programmfluss)
i = i + 1; // Addition
i = i - 1; // Subtraktion
i = i * 4; // Multiplikation
i = i / 4; // Division
i = i % 4; // Rest aus Division
// Kurzform
i += 1;
i -= 1;
i *= 4;
i /= 4;
i %= 4;
// noch Kürzer
i++;
i--;
2 > 1 // 2 grösser als 1 = wahr
2 >= 1 // 2 grösser oder gleich 1 = wahr
2 < 1 // 2 kleiner als 1 = unwahr
2
Der Ablauf eines Programmes kann durch Verzweigungen, Schleifen und Auswahlen gesteuert werden.
- if ( Bedingung ) Anweisung; // Wenn Bedingung (Logischer Operator) zutrifft Anweisung ausführen
- if ( Bedingung ) { Anweisung; Anweisung; } // Wenn Bedingung mehrere Anweisungen ausführen
- if ( Bedingung ) Anweisung 1; else Anweisung 2; // Wenn Zutrifft Anweisung 1 sonst 2 ausführen.
if ( i > 2 )
printf( "i ist grösser 2" );
if ( i < 2 )
printf( "i ist kleiner 2" );
else
printf( "i ist grösser oder gleich 2" );
- while ( Bedingung ) Anweisung; // Solange Bedingung zutrifft Anweisung ausführen
- while ( Bedingung ) { Anweisung; Anweisung; } // Solange Bedingung zutrifft Anweisungen ausführen
- for ( Start;Bedingung;Aktion ) Anweisung 1; // Start Zuweisung, Bedingung prüfen, wenn wahr Anweisung und Aktion ausführen
while ( 1 ) // Endlosloop
printf( "trifft zu" );
int i = 0;
while ( i < 10 )
i++;
for ( int i = 0; i < 10; i++ )
printf( "i = %d\n", i );
- switch ( Ganzzahlige Variable ) case Ganzzahl:Anweisung;break;****default:Anweisung;
int i = 1;
switch ( i )
{
case 1:
printf( "i = 1\n" );
break;
case 2:
printf( "i = 2\n" );
break;
default:
printf( "i ist weder 1 noch 2\n" );
}
Unter einer Funktion (function, in anderen Programmiersprachen auch Prozedur oder Subroutine genannt) versteht man ein Unterprogramm, das eine bestimmte Aufgabe erfüllt. Funktionen sind unter anderem sinnvoll, um sich oft wiederholende Befehle zu kapseln, so dass diese nicht jedes mal neu geschrieben werden müssen. Zudem verbessert es die Übersichtlichkeit des Sourcecodes erheblich, wenn der Programmtext logisch in Abschnitte bzw. Funktionen unterteilt wird.
- Eine Funktion kann Parameter besitzen, oder nicht.
- Eine Funktion kann einen Wert zurückgeben, oder nicht.
int f( int x ) // Funktion
{
return ( x * x );
}
int a = f(5); // Aufruf einer Funktion
Folgender Aufbau hat sich für embedded Systeme bewährt
// Import Libraries
// Definition der verwendeten Objekte.
// Funktionen welche von Hauptprogramm aufgerufen werden.
int main() // Hauptprogramm
{
// Initialisierungen von Variablen und Feintuning von Objekten.
while ( 1 )
{
// Anweisungen welche Endlos durchgeführt werden
}
}
// Import mbed Library
#include "mbed.h"
// Definition der verwendeten Objekte
DigitalOut led( LED1 );
/** Hauptprogramm */
int main()
{
while ( 1 )
{
led = !led; // LED Wert umkehren (0 oder 1)
thread_sleep_for ( 200 ); // warte 200 Millisekunden
}
}
Das Hauptprogramm wird, in der Regel, in der main.cpp Datei gespeichert