Hallo Community, nachdem ich mir etliche Forenbeiträge durchgelesen und immer noch keine funktionierende Lösung für mein Problem gefunden habe, will ich das Problem mal in einem separaten Beitrag schildern. Ich hoffe mir kann dabei jemand weiterhelfen. Folgende Files sind gegeben... Fonts.h #include <stdint.h> #ifndef Fonts_h #define Fonts_h #ifndef ELEMENT_NUMBER #define ELEMENT_NUMBER code-(font->chars[0].code) #endif . . . typedef struct { uint16_t length; // number of characters const tChar *chars; // reference to the characters } tFont; extern const tFont Arial; const tImage *find_image(const tFont *font, uint16_t code); #endif /* Fonts_h */ Fonts.c #include "Fonts.h" /* find image and return block size, width, height & bitmap */ const tImage *find_image(const tFont *font, uint16_t code) { if (font->chars[ELEMENT_NUMBER].code == code) { return (font->chars[ELEMENT_NUMBER].image); } else { return (0); } } const tFont Arial = { 95, Arial_array }; und main.c #include <stdint.h> #include "Fonts.h" int main(void) { const tImage *im = find_image(Arial, 0x20); return 0; } beim Compilieren kommt folgende Fehlermeldung bei der Funktion find_image in dem main.c-file: incompatible type for argument 1 of 'find_image' Ich hoffe es findet jemand den Fehler und kann mir dabei weiterhelfen. Gruß Jonny
1 | const tFont Arial = { 95, Arial_array }; |
2 | |
3 | find_image(const tFont *font, uint16_t code); |
4 | |
5 | |
6 | find_image(Arial, 0x20); |
find_image will ein zeiger! find_image(&Arial, 0x20);
find_image(const tFont *font,... ^^^ Datentyp? const tFont Arial ... ^^^ Datentyp? find_image(Arial ^^^ Datentyp?
Zu langsam. Wenn jemand die Antwort schon vorgekaut hat, sind Hinweise zum Selbstfinden überflüssig...
Habe ich auch schon ausprobiert... Dann kommt folgende Fehlermeldung, wobei ich nicht genau weiß was das zu bedeuten hat bzw. wodurch diese hervorgerufen wurde. Program Memory Usage : 5182 bytes 15,8 % Full Data Memory Usage : 4169 bytes 203,6 % Full (Memory Overflow)
Jonny schrieb: > Habe ich auch schon ausprobiert... > > Dann kommt folgende Fehlermeldung, wobei ich nicht genau weiß was das zu > bedeuten hat bzw. wodurch diese hervorgerufen wurde. > > Program Memory Usage : 5182 bytes 15,8 % Full > Data Memory Usage : 4169 bytes 203,6 % Full (Memory Overflow) steht doch alles da, die Programm ist mehr doppelt so groß wie es sein darf.
nachtrag: Es braucht mehr als doppelt sie viel ram wie vorhanden ist. Vermutlich ist dein Array viel zu groß.
@Jonny (Gast) >Dann kommt folgende Fehlermeldung, wobei ich nicht genau weiß was das zu >bedeuten hat bzw. wodurch diese hervorgerufen wurde. >Program Memory Usage : 5182 bytes 15,8 % Full >Data Memory Usage : 4169 bytes 203,6 % Full (Memory Overflow) 203,6% ist etwas viel. (Memory Overflow) Speicher Überlauf. Dein Controller (AVR?) hat nur 2048 Bytes RAM, du willst aber mehr als 4000 belegen. Beim AVR muss man die Daten dazu in den Flash packen. https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Flash_mit_PROGMEM_und_pgm_read Also eher so. const tFont Arial PROGMEM = { 95, Arial_array }; Ob die Bibliothek allerdings damit klar kommt, muss man prüfen. Eigentlich sollte das aber klappen.
Zuerst mal danke für die Antwort Peter. Die Lösung funktioniert soweit, wenn ich meine Arrays und Structs kürze. Also liegt es an der Datenmenge. Ich weiß nicht ob ich jetzt nochmal ein neuen Beitrag aufmachen soll, deswegen kurz die Frage in diesem. Ich habe in meinem Programmcode Bitmaps für die Darstellung von Zeichen auf einem Display hinterlegt. Jetzt habe ich natürlich folgendes Problem, dass ich eben keine Zeichen wegkürzen kann, sonst würden mir diese fehlen. Gibt es irgendeine Möglichkeit die Bitmaps komprimiert in das Programm einzubinden, bzw auf die MCU zu laden? Hier mal ein Beispiel für die Bitmap des Ausrufezeichens: static const uint8_t image_data_Arial_0x21[32] = { 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xc0, 0xf3, 0xc0, 0xf3, 0xc0, 0xf3, 0xc0, 0xf3, 0xc0, 0xf3, 0xc0, 0xf3, 0xc0, 0xf3, 0xc0, 0xf3, 0xc0, 0xff, 0xc0, 0xf3, 0xc0, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xc0 }; static const tImage Arial_0x21 = { image_data_Arial_0x21, 5, 16, 8};
Ja, es geht um AVR-GCC und einen ATmega328P uC. Danke im Voraus für die weiteren Antworten. Ich werde diese mal ausprobieren und ein bisschen rum basteln am Programm. Wenn ich das soweit ausprobiert habe, werde ich mich nochmal melden ob es funktioniert hat.
Eher so:
1 | > typedef struct { |
2 | > uint16_t length; // number of characters |
3 | > const __flash tChar *chars; // reference to the characters |
4 | > } tFont; |
5 | >
|
6 | > extern const __flash tFont Arial; |
7 | >
|
8 | > const __flash tImage* find_image (const __flash tFont *font, uint16_t code); |
9 | |
10 | > /* find image and return block size, width, height & bitmap */ |
11 | > const __flash tImage *find_image(const __flash tFont *font, uint16_t code) |
12 | > { |
etc.
Mittlerweile habe ich die Lösungen in meinen Quellcode integriert und es funktioniert alles einwandfrei, so wie ich mir das vorgestellt habe. In diesem Sinne nochmals danke an alle für die schnellen Antworten zu meinem Problem.
@Jonny (Gast) >Mittlerweile habe ich die Lösungen in meinen Quellcode integriert und es >funktioniert alles einwandfrei, so wie ich mir das vorgestellt habe. Und wie sieht die Lösung aus? https://www.mikrocontroller.net/articles/Netiquette#Happy_End
Jonny schrieb: > /* find image and return block size, width, height & bitmap */ Wer sich seine Fonts und das dazugehörige GDI derartig konstruiert, braucht sich nicht zu wundern, wenn dabei nix Gescheites herauskommt. Lade dir hier die Lernbetty herunter und schau dir die dortigen Fonts nebst Gdi an, da kannst du draus lernen, wie das effizient gemacht werden kann. W.S.
Ist wohl kein Verlust für die Allgemeinheit. Ich hab schon ne Menge Bastel-Fonts gesehen und die allermeisten waren schlichtweg idiotisch organisiert, weil sich die Erfinder keinerlei echte Gedanken zuvor gemacht haben. Eben immer mit dem Kopf durch die Wand. Nun ja, wer das ne Weile lang so praktiziert hat, wird vermutlich Probleme mit dem Innenleben seines Kopfes bekommen haben. Naja..so im Nachhinein finde ich meinen Font-Entwurf für die Lernbetty so richtig gut. Hat mir zumindest bei ganz vielen anderen Projekten sehr geholfen - eben weil ich damals gründlich genug nachgedacht hab, bevor ich in die Tasten gegriffen habe. Man kann damit proportionale und feste Breiten haben, auch Piktogramme und monochrome Grafiken sind möglich, kurzum, der Entwurf ist tragfähig. Das Einzige, was mich dabei noch stört, ist der Mangel an Unicode-Fähigkeit. Für die Zeichen stehen nur 8 Bit zur Verfügung und wenn man das auf 16 Bit erweitern will, läuft man Gefahr, den Font unnötig aufzublähen. W.S.
Es soll noch Leute geben, die eben nicht jeden Tag Zeit haben um zu antworten, deswegen erst jetzt die verspätete Antwort. @Falk: Sorry, wusste ich nicht, dass ich auch nochmal meine Lösung in den Beitrag posten soll. Die Lösung kommt sofort. @W.S.: Normalerweise antworte ich auf solche durchaus unnötige, arrogante und nicht dem Beitragsthema entsprechende Posts nicht. Aber für dich mache ich eine Ausnahme, weil so etwas kannst dir echt ersparen! Hilf lieber anderen Leuten, anstatt solch unqualifizierte Beiträge zu schreiben! Mir ist das zudem so was von egal, was du wie gemacht oder programmiert hast. Ich habe eben nicht ausreichend Zeit, um das Programm so zu verbessern, dass es optimal ist. Aber das solltest du eigentlich sehr genau wissen, dass es eben sehr viel Zeit braucht um ein Programm perfekt zu gestalten. Wenn das für dich neu ist, wirst du auch noch nichts von dem Pareto-Prinzip gehört haben. Aber was will man von so einem Kleingeist wie dir erwarten, wenn man es nötig hat solche Beiträge zu verfassen.
zum Abschluss des Beitrags noch meine Lösung... Fonts.h
1 | #include <stdint.h> |
2 | #ifndef Fonts_h
|
3 | #define Fonts_h
|
4 | |
5 | #ifndef ELEMENT_NUMBER
|
6 | #define ELEMENT_NUMBER code-(font->chars[0].code)
|
7 | #endif
|
8 | .
|
9 | .
|
10 | .
|
11 | typedef struct { |
12 | uint16_t length; // number of characters |
13 | const __flash tChar *chars; // reference to the characters |
14 | } tFont; |
15 | |
16 | extern const __flash tFont Arial; |
17 | |
18 | const __flash tImage *find_image(const tFont *font, uint16_t code); |
19 | |
20 | #endif /* Fonts_h */ |
Fonts.c
1 | #include "Fonts.h" |
2 | |
3 | /* find image and return block size, width, height & bitmap */
|
4 | const __flash tImage *find_image(const tFont *font, uint16_t code) |
5 | {
|
6 | if (font->chars[ELEMENT_NUMBER].code == code) { |
7 | return (font->chars[ELEMENT_NUMBER].image); |
8 | }
|
9 | else { |
10 | return (0); |
11 | }
|
12 | }
|
13 | |
14 | static const __flash uint8_t image_data_Arial_0x21[32] = { |
15 | 0xff, 0xc0, |
16 | 0xff, 0xc0, |
17 | 0xff, 0xc0, |
18 | 0xf3, 0xc0, |
19 | 0xf3, 0xc0, |
20 | 0xf3, 0xc0, |
21 | 0xf3, 0xc0, |
22 | 0xf3, 0xc0, |
23 | 0xf3, 0xc0, |
24 | 0xf3, 0xc0, |
25 | 0xf3, 0xc0, |
26 | 0xff, 0xc0, |
27 | 0xf3, 0xc0, |
28 | 0xff, 0xc0, |
29 | 0xff, 0xc0, |
30 | 0xff, 0xc0 |
31 | };
|
32 | static const __flash tImage Arial_0x21 = { image_data_Arial_0x21, |
33 | 5, 16, 8}; |
34 | |
35 | const __flash tFont Arial = { 95, |
und main.c
1 | #include <stdint.h> |
2 | #include "Fonts.h" |
3 | |
4 | int main(void) |
5 | {
|
6 | const __flash tImage *im = find_image(&Arial, 0x20); |
7 | |
8 | return 0; |
9 | }
|
Mod: Code-Tags ergänzt; bitte Verwenden!
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.