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
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.
@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.
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.