Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
lehrkraefte:blc:informatik:ffprg2-2020:esp32-io-and-vars [2020/08/12 09:36] Ivo Blöchliger created |
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 werden, bzw. | + | 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 geschehen soll. |
- | * **int** | + | * **int** |
- | * **float** | + | * **long** und **long long**: 4 und 8 Bytes. |
+ | * **float** | ||
* **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 | ||
+ | } | ||
+ | </ |