Hallo,
ich habe hier einen Quellcode, der je nach gewünschten Features
unterschiedlich zusammengebaut werden soll - unter anderem um auf einem
Mikrocontroller nicht unnötig Platz und Rechenzeit zu verschwenden.
Am besten funktioniert dafür
1 | #ifdef MENU_TEXT_ENABLE_5X5
|
2 | #if (MENU_TEXT_FONT_CLASSES > 1)
|
3 | #define MENU_CHECK_FONT_5X5_START if ((font >= 12) && (font <= 15)) {
|
4 | #else
|
5 | #define MENU_CHECK_FONT_5X5_START {
|
6 | #endif
|
7 | #else
|
8 | #define MENU_CHECK_FONT_5X5_START if (0) {
|
9 | #endif
|
10 |
|
11 | #define MENU_CHECK_FONT_5X5_END }
|
12 |
|
13 | #ifdef MENU_TEXT_ENABLE_5X7
|
14 | #if (MENU_TEXT_FONT_CLASSES > 1)
|
15 | #define MENU_CHECK_FONT_5X7_START if (font <= 3) {
|
16 | #define MENU_CHECK_FONT_5X7_END }
|
17 | #else
|
18 | #define MENU_CHECK_FONT_5X7_START {
|
19 | #define MENU_CHECK_FONT_5X7_END }
|
20 | #endif
|
21 | #else
|
22 | #define MENU_CHECK_FONT_5X7_START if (0) {
|
23 | #define MENU_CHECK_FONT_5X7_END }
|
24 | #endif
|
25 |
|
26 | #ifdef MENU_TEXT_ENABLE_8X15
|
27 | #if (MENU_TEXT_FONT_CLASSES > 1)
|
28 | #define MENU_CHECK_FONT_8X15_START if ((font >= 4) && (font <= 8)) {
|
29 | #else
|
30 | #define MENU_CHECK_FONT_8X15_START {
|
31 | #endif
|
32 | #else
|
33 | #define MENU_CHECK_FONT_8X15_START if (0) {
|
34 | #endif
|
35 |
|
36 | #define MENU_CHECK_FONT_8X15_END }
|
Also je nach dem welcher Font, und vor allem ob mehr als einer,
verwendet wird, wird der Quellcode unterschiedlich zusammen gebaut.
Das führt aber bei einem nicht benutzten Font bei folgendem Code zu
Problemen:
1 | MENU_CHECK_FONT_5X5_START
|
2 | bmpsource = &(characters_5x5[MENU_TEXT_5X5_BYTES * cdraw]);
|
3 | MENU_CHECK_FONT_5X5_END
|
4 | MENU_CHECK_FONT_5X7_START
|
5 | bmpsource = &(characters_5x7[MENU_TEXT_5X7_BYTES * cdraw]);
|
6 | MENU_CHECK_FONT_5X7_END
|
7 | MENU_CHECK_FONT_8X15_START
|
8 | bmpsource = &(characters_8x15[MENU_TEXT_8X15_BYTES * cdraw]);
|
9 | MENU_CHECK_FONT_8X15_END
|
Wenn ein Font nicht definiert ist und somit dass array, z.B.
characters_5x7 auch nicht vorhanden ist, ist das Programm nicht korrekt
- obwohl der Compiler den Zugriff dank if (0) weg optimieren wird.
Was ich eigentlich bräuchte wäre also ein
1 | #ifdef MENU_TEXT_ENABLE_5X7
|
2 | #if (MENU_TEXT_FONT_CLASSES > 1)
|
3 | #define MENU_CHECK_FONT_5X7_START if (font <= 3) {
|
4 | #define MENU_CHECK_FONT_5X7_END }
|
5 | #else
|
6 | #define MENU_CHECK_FONT_5X7_START {
|
7 | #define MENU_CHECK_FONT_5X7_END }
|
8 | #endif
|
9 | #else
|
10 | #define MENU_CHECK_FONT_5X7_START #if 0
|
11 | #define MENU_CHECK_FONT_5X7_END #endif
|
12 | #endif
|
Aber das geht leider nicht. Oder gibt es doch eine Möglichkeit?
Notfalls muss ich auch &(characters_5x7[MENU_TEXT_5X7_BYTES * cdraw]);
durch ein Makro ersetzen, welches dann je nach bedarf das passende Array
oder NULL ist.