Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
lehrkraefte:blc:informatik:ffprg2-2020:esp32-io-and-vars [2020/08/12 10:09] Ivo Blöchliger |
lehrkraefte:blc:informatik:ffprg2-2020:esp32-io-and-vars [2020/08/12 15:48] (current) Ivo Blöchliger [Ausgabe mit Serial.printf] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Typen ====== | ====== Typen ====== | ||
Alles in C++ muss einen Typ haben. Der Typ einer Variablen kann nicht geändert werden. | Alles in C++ muss einen Typ haben. Der Typ einer Variablen kann nicht geändert werden. | ||
- | ===== Ganzzahl-Typen ===== | + | ===== Zahl-Typen ===== |
Die Typen '' | Die Typen '' | ||
- | Traditionellerweise gibt es folgende Typen, die aber je nach Platform unterschiedlich gross sind. Bei char ist nicht einmal klar, ob die Zahlen | + | Traditionellerweise gibt es folgende Typen, die aber je nach Platform unterschiedlich gross sind. Bei char ist nicht einmal klar, ob wenn als Zahl interpretiert es mit oder ohne Vorzeichen |
* **int** und **unsigned int** EPS32: 4 Bytes, Arduino Uno: 2 Bytes | * **int** und **unsigned int** EPS32: 4 Bytes, Arduino Uno: 2 Bytes | ||
* **long** und **long long**: 4 und 8 Bytes. | * **long** und **long long**: 4 und 8 Bytes. | ||
* **float** und **double** Fliesskommazahlen, | * **float** und **double** Fliesskommazahlen, | ||
* **bool** true oder false | * **bool** true oder false | ||
- | * **char** | + | * **char** |
+ | ==== Umwandlung der Typen ==== | ||
+ | Ist in einem Ausdruck ein float oder double involviert, ist auch das Resultat ein float oder double. | ||
+ | Sind in einem Ausdruck nur ganzzahlige Typen involviert, ist auch das Resultat ganzzahlig, wobei immer gegen Null hin gerundet wird: | ||
+ | <code c++> | ||
+ | void setup() { | ||
+ | Serial.begin(115200); | ||
+ | delay(200); | ||
+ | int a=7; | ||
+ | int b=6; | ||
+ | int c = a/b; | ||
+ | Serial.printf(" | ||
+ | a = -7; | ||
+ | c = a/b; | ||
+ | Serial.printf(" | ||
+ | } | ||
+ | void loop() { | ||
+ | // tu nix | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==== Ausgabe mit Serial.printf ==== | ||
+ | * %d (int) | ||
+ | * %f (float, double) | ||
+ | * %l (long) | ||
+ | * %du, %llu (unsigned int, unsigned long long) | ||
+ | * %c (char) | ||
+ | * \n Zeilenumbruch | ||
+ | |||
+ | [[http:// | ||
+ | ==== Speicherbedarf und Umfang ==== | ||
+ | |||
+ | <code c++> | ||
+ | // Der Preprocessor erlaubt auch Macros: | ||
+ | #define SHOWSIZE(T) Serial.printf(# | ||
+ | |||
+ | #define HASSIGN(T) Serial.print(" | ||
+ | |||
+ | void setup() { | ||
+ | Serial.begin(115200); | ||
+ | delay(400); | ||
+ | Serial.println(" | ||
+ | |||
+ | SHOWSIZE(char); | ||
+ | SHOWSIZE(byte); | ||
+ | SHOWSIZE(short); | ||
+ | SHOWSIZE(int); | ||
+ | SHOWSIZE(long); | ||
+ | SHOWSIZE(long long); | ||
+ | Serial.println(" | ||
+ | SHOWSIZE(float); | ||
+ | SHOWSIZE(double); | ||
+ | Serial.println(" | ||
+ | HASSIGN(char); | ||
+ | HASSIGN(byte); | ||
+ | HASSIGN(signed char); | ||
+ | HASSIGN(unsigned short); | ||
+ | HASSIGN(unsigned int); | ||
+ | unsigned long long a = -1; | ||
+ | Serial.printf(" | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | // nix tun... | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==== Rechengeschwindigkeit ==== | ||
+ | <code c++> | ||
+ | #define RUN(TYPE, FORMAT) addtest< | ||
+ | #define RUM(TYPE, FORMAT) multest< | ||
+ | |||
+ | template< | ||
+ | void addtest(int n, char *t, char *f) { | ||
+ | long zeit = micros(); | ||
+ | // volatile bezeichnet Variablen, die z.B. von Interrupts verändert werden könnten. | ||
+ | // Damit kann der Kompiler keine Optimierungen machen, weil sich der Wert ausserhalb | ||
+ | // des normalen Programmflusses ändern könnte. | ||
+ | volatile T r = 0; // Damit das Ding nicht wegoptimiert wird. | ||
+ | volatile T a = 3456; // Damit das Ding nicht wegoptimiert wird. | ||
+ | for (int i=0; i<n; i++) { | ||
+ | r = r+a; | ||
+ | } | ||
+ | zeit = micros()-zeit; | ||
+ | Serial.printf(" | ||
+ | // Wenn das Resultat nicht gebraucht wird, wird die ganze Schleife | ||
+ | // gnadenlos wegoptimiert ;-) | ||
+ | Serial.print(" | ||
+ | Serial.printf(f, | ||
+ | Serial.println(); | ||
+ | } | ||
+ | |||
+ | template< | ||
+ | void multest(int n, char *t, char *f) { | ||
+ | long zeit = micros(); | ||
+ | volatile T b = 27; // Damit das Ding nicht wegoptimiert wird. | ||
+ | volatile T r = 0; // Damit das Ding nicht wegoptimiert wird. | ||
+ | T a = 5234; | ||
+ | for (int i=0; i<n; i++) { | ||
+ | r = a*b; | ||
+ | } | ||
+ | zeit = micros()-zeit; | ||
+ | Serial.printf(" | ||
+ | // Wenn das Resultat nicht gebraucht wird, wird die ganze Schleife | ||
+ | // gnadenlos wegoptimiert ;-) | ||
+ | Serial.print(" | ||
+ | Serial.printf(f, | ||
+ | Serial.println(); | ||
+ | } | ||
+ | |||
+ | |||
+ | void setup() { | ||
+ | Serial.begin(115200); | ||
+ | delay(200); | ||
+ | Serial.print(" | ||
+ | RUN(int, " | ||
+ | RUN(long long, " | ||
+ | RUN(float, " | ||
+ | RUN(double, " | ||
+ | | ||
+ | Serial.println(); | ||
+ | | ||
+ | RUM(int, " | ||
+ | RUM(long long, " | ||
+ | RUM(float, " | ||
+ | RUM(double, " | ||
+ | |||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | // tu nix | ||
+ | } | ||
+ | </ |