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
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:
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.
Uargh. Muss das wirklich sein? Wenn zur Compile-Zeit klar ist, dass ein
Ausdruck in einem if falsch ist, wirft der Compiler den Code eh weg ...
so schlau sind die schon. Da brauchst du nicht diesen Makro-Dschungel
bauen ... schon gar nicht, um 5 Byte Codegröße zu sparen.
Ist ja mega umständlich! Deklariere alle Fonts einzeln als
globale/statische Variablen. Dann machst du ein globales Array welches
Pointer auf die gewünschten Fonts enthält. Das kann man auch simpel per
Makros machen:
Dieses Array kannst du dann nach belieben iterieren.
Nicht verwendete Fonts werden vom Compiler schlicht wegoptimiert.
Ansonsten schließe ich mich Sven an.
ein weiterer Ansatz ist die Auswahl an Parameter und Codeabschnitte
(=Quelldateien) ausserhalb zu regeln.
Im Makefile kann vor dem Kompilieren in einem (Temporären) Verzeichnis
das zusammenkopiert werden was für eine gewünschte Buildvariante
benötigt ist.
Vor dem Kopilieren kann auch ein Stück Quellcode variantenspezifisch
generiert werden, z.b. eine explizite #include-Liste.
Bei so organisierten Projekte tut man allerdings gut daran, buildlogs
(oder extrakt davon) aufzubewahren, damit danach jederzeit die Binaries
zugeordnet werden können (z.B. per SHA1/MD5 Prüfsumme oder eine andere
"Signatur", welche natürlich beim builden mitgeloggt werden muss)
Malte _. schrieb:> Also je nach dem welcher Font, und vor allem ob mehr als einer,> verwendet wird, wird der Quellcode unterschiedlich zusammen gebaut.
Baue einfach nicht hinein, was du nicht brauchst oder nimm einen Chip
mit genügend Platz im Flash.
Solche Definier-Orgien sind mir ein Graus und sie sind ein netter
Ansatz, um sich selbst Probleme zu machen. Wer hindert dich eigentlich
daran, dein Gdi projektspezifisch zu machen und dort nur das einzubauen,
was du tatsächlich benötigst?
W.S.
Das ist nicht nur: "Aua!" sondern schon "Au weia!".
Sozusagen das programmatische Äquivalent zu Kurt Bindl und dem Stefan
Hackebusch.
Kein Mensch, der noch alle Tüten in der Schüssel hat programmiert so.
Und im professionellen Umfeld kriegst Du Berufsverbot.
OK. Schluss mit lustig.
Es mag mühsam sein, aber vielleicht schreibst Du hier mal Deine
Anforderungen detailliert auf und wir überlegen zusammen, wie man das
vernünftig machen kann.
W.S. schrieb:> Baue einfach nicht hinein, was du nicht brauchst
Genau das versuche ich ja automatisiert zu erreichen ;)
>> Solche Definier-Orgien sind mir ein Graus und sie sind ein netter> Ansatz, um sich selbst Probleme zu machen.
Jep, und weil es mir selbst nicht gefällt frage ich hier ja nach einer
besseren Lösung.
Hostenmatz schriebt:
> Es mag mühsam sein, aber vielleicht schreibst Du hier mal Deine> Anforderungen detailliert
Es geht um mein Projekt:
Beitrag "Menu Designer für Grafik LCDs inklusive grafischem Editor"
In dem möchte ich die derzeit separaten Dateien mit verschiedenen Fonts
(und entsprechend doppelt zu watenden Code) vereinheitlichen (und habe
UTF-8 Support eingebaut).
Der Benutzer kann relativ einfach in einem Editor einen Font auswählen
und der Editor baut daraus passende Defines, die anzeigen welcher Font
tatsächlich verwendet wird. Natürlich könnte ich kurzerhand alle
Fontvarianten im Quellcode abdecken, aber dann würde ich genau den weg
gehen, den leider so viele Bibliotheken gehen - sie werden von Version
zu Version größer und langsamer ohne dass wirklich die Features benötigt
werden. Daher mein Ansatz direkt zur Compilezeit unnützen Code zu
entfernen.
> Und im professionellen Umfeld kriegst Du Berufsverbot.
Zu spät ;)
Malte _. schrieb:> [...]>> Hostenmatz schriebt:>> Es mag mühsam sein, aber vielleicht schreibst Du hier mal Deine>> Anforderungen detailliert>> Es geht um mein Projekt:> Beitrag "Menu Designer für Grafik LCDs inklusive grafischem Editor"> In dem möchte ich die derzeit separaten Dateien mit verschiedenen Fonts> (und entsprechend doppelt zu watenden Code) vereinheitlichen (und habe> UTF-8 Support eingebaut).
Das mag so sein. Aber ich lese mir jetzt nicht den Thread durch, um das
heraus zu suchen, was Dir Probleme beim Design macht. Ich sehe zwar ein
kleines How-To für Anfänger, aber keine "Entwicklungsdokumentation" in
der die Funktionsweise im Gesamtzusammenhang und im Detail erklärt wird.
Fonts sind in der Regel einfach konstante Arrays. Und eines oder mehrere
davon, wählt man per define aus. Alle anderen ignoriert der Compiler und
das kostet minimal Zeit. Es mag ja sein, dass Dein System ein wenig mehr
Möglichkeiten bietet und deswegen flexibler bei der Fontauswahl sein
muss, evtl. auch zur Laufzeit, je nach Font, unterschiedlich arbeiten
muss; aber das solltest Du mal wirklich ausführlich, mit Grafiken
(Daten- und Kontrollfluss) beschreiben und klarlegen, was Du erreichen
willst, so das ein "Entwickler" das nachvollziehen kann ohne sich erst
durch den Code zu wühlen und das reverse-engineeren muss.
Malte _. schrieb:> Die Idee mit dem Weak gefällt mir. Danke :)
Das ist ja furchtbar... Braucht man wirklich eine
Compiler/Linker-spezifische unportable Anweisung, um ein derart simples
Problem zu lösen? Da sind die ersten Vorschläge doch wesentlich
sauberer.
Eine eigene Frage?
Dieser Thread ist über 10 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.