Forum: PC-Programmierung C-Datei zur Laufzeit einbinden?


von Erwin E. (kuehlschrankheizer)


Lesenswert?

Ist es möglich, dass ein C-Programm (Visual C) zur Laufzeit eine weitere 
C-Datei mit Daten einbindet?

Hintergrund: Ich programmiere ein Tool, welches Fontdateien in ein 
Format wandelt, das anschließend von meiner GLCD-Library auf einem 
ATmega verwendet werden kann. Es gibt aber mehrere Font-Dateien, die 
jeweils als C-Code vorliegen. Zur Laufzeit möchte ich nun eine dieser 
C-Dateien zur Verarbeitung auswählen können.
Momentan ändere ich den Code meines Konverters und schreibe die 
jeweilige Font-Datei direkt in den Quellcode. Das funktioniert, ist aber 
eher unpraktisch.

Mit der Forensuche habe ich ältere Threads gefunden, die das Thema 
behandeln. Leider geht es immer um C++. Da ich vor zwei Monaten meine 
erste Zeile C Code geschrieben habe, hilft mir das leider nicht weiter. 
Bis auf Weiteres reicht mir C vollkommen, C++ ist erstmal kein Thema.

Die Font-Dateien werden von diesem Programm erzeugt: 
https://www.riuson.com/lcd-image-converter

von Lexa (Gast)


Lesenswert?

Zur Compile-Zeit geht das.

Könntest ggf über die MakeFiles steuern.

von MaWin (Gast)


Lesenswert?

Erwin E. schrieb:
> Tool, welches Fontdateien in ein
> Format wandelt, das anschließend von meiner GLCD-Library auf einem
> ATmega verwendet werden kann. Es gibt aber mehrere Font-Dateien, die
> jeweils als C-Code vorliegen. Zur Laufzeit möchte ich nun eine dieser
> C-Dateien zur Verarbeitung auswählen können

Pointer?

von Theor (Gast)


Lesenswert?

Theoretisch ist es möglich zur Laufzeit eines C-Programmes ein weiteres 
C-Programm im Quellcode einzulesen, es zu interpretieren oder auch zu 
kompilieren und es auszführen resp. auf die darin enthaltenen Variablen 
zuzugreifen.

Praktisch bedeutet das, einen Compiler oder Interpreter für C zu 
schreiben. Ausserdem muss man einen Loader dafür schreiben, denn 
Anwendungen ist, aus Sicherheitsgründen, auf modernen Betriebssystem 
nicht gestattet ihren eigenen Code zu modifizieren. Das erfordert auch 
Administratoren-Rechte, was eigentlich eher nicht zu empfehlen ist.

Das Ganze ist in jedem Fall so aufwendig und erfordert soviel Wissen und 
Erfahrung, jedenfalls mehr, als man sich in 2 Monaten erwerben kann, 
dass sich eine andere Alternative eventuell zu erwägen lohnt.

Der Quellcode des von Dir verwendeten Image-Converters ist lt. der 
Webseite offen. Es wäre also möglich, den Quellcode so zu verändern 
resp. zu erweitern, dass er als Ausgabe anstatt des Quellcodes, den Du 
erst noch umwandeln musst, gleich den passenden Code ausgibt.

Das ist im Vergleich wesentlich weniger aufwendig und entspricht in etwa 
dem Aufwand, den Du schon für Deinen eigenen Konverter hattest und vor 
allem dem Wissen, das Du dafür brauchtest. Vermutlich kannst Du sogar 
Teile Deines eigenen Konverters dafür verwenden.

von Rolf M. (rmagnus)


Lesenswert?

Theor schrieb:
> Theoretisch ist es möglich zur Laufzeit eines C-Programmes ein weiteres
> C-Programm im Quellcode einzulesen, es zu interpretieren oder auch zu
> kompilieren und es auszführen resp. auf die darin enthaltenen Variablen
> zuzugreifen.

Ein Interpreter für C (und C++) wäre z.B. cling. Den kann man auch recht 
einfach in eigene Programme integrieren.
https://cdn.rawgit.com/root-project/cling/master/www/index.html
Es sollte sogar gehen, das komplette Programm in cling interpretiert 
laufen zu lassen.
Ist allerdings alles etwas overkill, um eine als C-Code erzeugte 
Fontdatei einzulesen. Dafür sollte ja nur ein extrem reduziertes Subset 
von C nötig sein.


> Praktisch bedeutet das, einen Compiler oder Interpreter für C zu
> schreiben. Ausserdem muss man einen Loader dafür schreiben, denn
> Anwendungen ist, aus Sicherheitsgründen, auf modernen Betriebssystem
> nicht gestattet ihren eigenen Code zu modifizieren.

Wie macht das dann ein JIT-Compiler?

: Bearbeitet durch User
von A. S. (Gast)


Lesenswert?

Hat Dein Programm eine Bedienoberfläche? Wenn ja, dann verwende alle 
fontdateien unter verschiedenen Namen und lass den Benutzer eine 
aussuchen.

Wenn nein, ist dein Weg ok. Sorge nur dafür, dass builden schnell geht 
(makefile) und gut.

Oder lass per Script für jeden Font ein eigenes Programm erzeugen. Also 
kopieren des ersten fonts zu font.c und dann make, danach die exe 
umbenennen gemäß dem fontnamen. Dann zweiten font kopieren zu font.c,...

von Ben S. (bensch123)


Lesenswert?

Sowas nennt man DLL

von Programmiersprachentheaterintendant (Gast)


Lesenswert?

Die Fontbeschreibung, auch wenn als C-Code vorliegend, umfassen 
bestimmt ausschliesslich Daten und keine Instruktionen.
Also liegt der einfache Fall vor, dass zur Laufzeit nur (dynamische) 
Datenstrukturen gemäss Benutzerauswahl zu befüllen sind.

Die Übung besteht also darin, die C-Quellcode-Fontdaten in ein anderes 
Format zu überführen, dass sich einfacher vom endgültigen Programm 
einlesen lässt.

NB: niemand käme auf die Idee, z.B. ein Bücherverwaltungsprogramm so zu 
schreiben dass die Bücherdaten als Quellcode eingebunden wären...

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Ben S. schrieb:
> Sowas nennt man DLL

Auf einem ATmega? Da sind mal wieder echte Helden unterwegs.

Programmiersprachentheaterintendant schrieb:
> Die Fontbeschreibung, auch wenn als C-Code vorliegend, umfassen
> bestimmt ausschliesslich Daten und keine Instruktionen.

Ja, wie man leicht durch Verfolgen des angegebenen Links feststellen 
kann.

> Also liegt der einfache Fall vor, dass zur Laufzeit nur (dynamische)
> Datenstrukturen gemäss Benutzerauswahl zu befüllen sind.

Was habt ihr alle mit dem dynamischen Scheißdreck?

A-T-M-E-G-A!

Mikrocontroller ... verstanden?

> Die Übung besteht also darin, die C-Quellcode-Fontdaten in ein anderes
> Format zu überführen, dass sich einfacher vom endgültigen Programm
> einlesen lässt.

Nein, die Übung besteht darin mehrere der Font-Dateien in den Code zu 
kompilieren und zur Laufzeit durch einen noch zu wählenden Mechanismus 
(zum Beispiel einen Pointer auf die Datenstruktur), den gewünschten Font 
auszuwählen.

Wenn man sie zusammen kompiliert müssen die die Datenstrukturen in den 
Fonts nur unterschiedliche Namen haben.

Für Bonuspunkte: Den generierten C-Code so modifizieren dass er ins 
EEPROM gepackt wird um Flash zu sparen.

von N. M. (mani)


Lesenswert?

Hannes J. schrieb:
> Auf einem ATmega? Da sind mal wieder echte Helden unterwegs.

Scheinbar schon. Ihnen ist zumindest aufgefallen dass der TO von einem 
"Tool" spricht.

Hannes J. schrieb:
> Was habt ihr alle mit dem dynamischen Scheißdreck?
> A-T-M-E-G-A!

Und das ganze in der Rubrik "PC-Programmierung" eröffnet wurde ;-)

von Rolf M. (rmagnus)


Lesenswert?

Hannes J. schrieb:
> Ben S. schrieb:
>> Sowas nennt man DLL
>
> Auf einem ATmega?

Nein, auf einem PC.

Erwin E. schrieb:
> Hintergrund: Ich programmiere ein Tool, welches Fontdateien in ein
> Format wandelt, das anschließend von meiner GLCD-Library auf einem
> ATmega verwendet werden kann.

Dieses besagte Tool soll offenbar nicht auf dem ATmega laufen, sondern 
nur Code für den ATmega erzeugen.

>> Also liegt der einfache Fall vor, dass zur Laufzeit nur (dynamische)
>> Datenstrukturen gemäss Benutzerauswahl zu befüllen sind.
>
> Was habt ihr alle mit dem dynamischen Scheißdreck?
>
> A-T-M-E-G-A!
>
> Mikrocontroller ... verstanden?

Ganz ruhig.

von Ben S. (bensch123)


Lesenswert?

Hannes J. schrieb:
> Auf einem ATmega? Da sind mal wieder echte Helden unterwegs.

Nix Atmega. Forum: PC-Programmierung. Der Author sagt:

Erwin E. schrieb:
> Ist es möglich, dass ein C-Programm (Visual C) zur Laufzeit eine weitere
> C-Datei mit Daten einbindet?

Erwin E. schrieb:
> Ich programmiere ein Tool, welches Fontdateien in ein
> Format wandelt, das anschließend von meiner GLCD-Library auf einem
> ATmega verwendet werden kann.

Er redet von einem Tool, einem Konverter. Nirgends steht, dass er auf 
einem Atmega zur Laufzeit irgendwelche C-Dateien austauschen möchte.

Also schließe ich daraus, dass er eine Desktopanwendung meint.

: Bearbeitet durch User
von N. M. (mani)


Lesenswert?

Ben S. schrieb:
> Sowas nennt man DLL

War auch mein erster Gedanke als ich von dynamischem "hinzufügen" 
gelesen habe.

Programmiersprachentheaterintendant schrieb:
> umfassen bestimmt ausschliesslich Daten und keine Instruktionen

So sehe ich es auch. Die Zeichen und evtl noch ein paar Einstellungen. 
Ich würde es wie viele andere Programme auch machen und eine 
x_language.xml dazu legen die das Programm einliest beim Startup oder 
falls eine GUI vorhanden ist auch noch nach dem ändern der Einstellung.

von MaWin (Gast)


Lesenswert?

> von MaWin (Gast) 14.04.2020 00:36

Ein Beitrag des Psychopathen der seinen Namen nicht kennt und 
stattdessen MaWin ins Namensfeld schreibt um mir seine 
Schwachsinnsantwort in die Schuhe zu schieben.

Erwin E. schrieb:
> Ist es möglich, dass ein C-Programm (Visual C) zur Laufzeit eine weitere
> C-Datei mit Daten einbindet?

Nein.

Erwin E. schrieb:
> Hintergrund: Ich programmiere ein Tool, welches Fontdateien in ein
> Format wandelt,

Fontdaten haben einen Vorteil: es sind Fazen. Die müssen nicht 
kompiliert werden. Die müssen (zur Lazfzeit) nur eingelesen werden. Wenn 
also das Programm irgendwas in der Art

char font[256][8];

enthält, schreibt man das so (uninitialisiert) ins Programm und lässt 
das Programm am Anfang diese Daten von einer externen Datei einlesen

f=open(argv[1],O_RDONLY|O_BINARY);
read(font,256*8,f);

Am einfachsten geht das wie oben, wenn in der fontfile.bin nicht dein C 
code zur font Datenstruktur steht, in der Art

char font[256][8]=
{
  {0x00,0x01,0x02,...

sondern die Binärdaten direkt. Da du die Datei ja per Programm erzeugst, 
sollte das die leichteste Übung sein

von MaWin (Gast)


Lesenswert?

MaWin schrieb:
> Beitrag

Anderer Gast missbraucht meinen Namen im Thread.

-> bitte löschen!

von Ben S. (bensch123)


Lesenswert?

MaWin schrieb:
> Anderer Gast missbraucht meinen Namen im Thread.
>
> -> bitte löschen!

Dann registriere dich doch endlich mal, meine Güte. Mimimi, ich möchte 
mich nicht registrieren, mimi dieser Registrationszwag, mimimi... bald 
gibts Impfzwang, weinst du dann auch so rum oder schreist du Hurra? Das 
wird im Gegensatz zu hier unter die Haut gehen und es gibt keinen 
Ausweg.

Dann passiert sowas auch nicht. Meine Güte...

: Bearbeitet durch User
von Programmiersprachentheaterintendant (Gast)


Lesenswert?

> Hannes J. schrieb:
>> Was habt ihr alle mit dem dynamischen Scheißdreck?
>> A-T-M-E-G-A!

Hier auf uC.net ist es ja schon bedrückend wie klein man sich die 
Programmierwelt in 8 Bit redet, aber das toppt es noch!

Wie haben es bloss unsere "Altvorderen" auf C64, Apple][ & Co. 
geschafft, uns eine Grundlage zu hinterlassen...

Ich schrieb "... (dynamisch) ..." in Klammern weil es zwar naheliegend 
sein könnte, letztlich aber bei 26 Buchstaben, 10 Ziffern ach was bei 
nichtmal 127 druckbare ASCII Zeichen es sich hier um eine kleine fixe 
Menge handelt.

Das lässt sich ohne nennenswerte Einschränkungen garantiert auch auf 
AtMega umsetzten!

von Programmiersprachentheaterintendant (Gast)


Lesenswert?

MaWin schrieb:
>> von MaWin (Gast) 14.04.2020 00:36
>
> Ein Beitrag des Psychopathen der seinen Namen nicht kennt und
> stattdessen MaWin ins Namensfeld schreibt um mir seine
> Schwachsinnsantwort in die Schuhe zu schieben.

Genau. Keiner der vielen MaWins kennt Pointers weil...

> Fontdaten haben einen Vorteil: es sind Fazen.

Fazen? Schwachsinnsantwort, in der Tat.
Sollte es sich jedoch als Parkinson herausstellen, wo das Zittern der 
Finger das Treffen der richtigen Tasten behindert, so bitte ich um 
Verzeihung.

Ausserdem:
> also das Programm irgendwas in der Art
>
> char font[256][8];
...soll sowas ausgerechnet in C keine Pointers sein?

Vielleicht sollte "MaWin" tatsächlich als String im Namensfeld 
unterbunden werden (wie andere Strings übrigens bereits sind) damit 
sowohl der originale (selbstbezeichnete) Schwachsinn wie auch die 
vermeintlich psychopatischen Klone anders bezeichnet daherkommen.

von Theor (Gast)


Lesenswert?

Rolf M. schrieb:
> Theor schrieb:
>> Theoretisch ist es möglich zur Laufzeit eines C-Programmes ein weiteres
>> C-Programm im Quellcode einzulesen, es zu interpretieren oder auch zu
>> kompilieren und es auszführen resp. auf die darin enthaltenen Variablen
>> zuzugreifen.
>
> Ein Interpreter für C (und C++) wäre z.B. cling. Den kann man auch recht
> einfach in eigene Programme integrieren.
> https://cdn.rawgit.com/root-project/cling/master/www/index.html
> Es sollte sogar gehen, das komplette Programm in cling interpretiert
> laufen zu lassen.
> Ist allerdings alles etwas overkill, um eine als C-Code erzeugte
> Fontdatei einzulesen. Dafür sollte ja nur ein extrem reduziertes Subset
> von C nötig sein.

Auf Deine letzte Aussage, dass das ein unangemessen hoher Aufwand für 
eine C-Datei ist, die (vermutlich) lediglich Definitionen und 
Initalisierungen enthält, wollte ich eigentlich hinaus.

Ich nehme an, das gilt auch für die Verwendung von cling.

> Wie macht das dann ein JIT-Compiler?

Es ist, dass beschrieb ich ja schon, wenn auch sehr grob (und nicht auf 
JITs bezogen) durchaus möglich ausführbaren Code programmatisch zu 
erzeugen und auszuführen.

Nur nützt das alles dem TO, da wo er steht, nichts, denke ich.
Wozu also darüber diskutieren, ob und wie es möglich ist ausführbaren 
Code zu erzeugen und auszuführen. Ich kann mir nicht denken, dass das 
für den TO, an der Stelle, an der er sich befindet, von Nutzen ist.
Siehst Du das anders?

Für eine sinnvolle Alternative halte ich das von anderen Antwortern 
genannte parsen der C-Deklaration und Initialisierungen zum Zwecke der 
Speicherung und Neu-Ausgabe.
Allerdings ist das immer noch in gewisser Weise von hinten durchs Auge 
geschossen. Die Infrastruktur dazu muss ja in dem schon verwendeten 
Programm vorhanden sein.
Aus meiner Sicht, ändert "man" den vorhanden Code so, dass er die 
Ausgabe in der gewünschten Form macht - und erfindet das Rad nicht neu.
Als Anfänger lernt man so auch mal Code von einem anderen Autor 
verstehen und das in einer sinnvollen Anwendung.
Von dieser Vorgehensweise würde ich allenfalls abraten, falls der Code 
zu unstrukturiert ist.

von Jim M. (turboj)


Lesenswert?

Programmiersprachentheaterintendant schrieb:
> Das lässt sich ohne nennenswerte Einschränkungen garantiert auch auf
> AtMega umsetzten!

Atmegas haben verdammt wenig RAM und können den Flash nicht zur Laufzeit 
beschreiben. Ich sehe da ergo gleich 2 nicht-triviale Einschränkungen.

Die Sache mit der C-Source hat ja grade den Zweck die Daten in den Flash 
packen zu können...

von Wolfgang (Gast)


Lesenswert?

Jim M. schrieb:
> Atmegas haben verdammt wenig RAM und können den Flash nicht zur Laufzeit
> beschreiben.

Was macht denn ein Bootloader sonst?

von Erwin E. (kuehlschrankheizer)


Angehängte Dateien:

Lesenswert?

Vielen Dank für die rege Beteiligung, auch wenn man deutlich merkt, dass 
die Nerven bei vielen blank liegen...
Die bisherigen Tipps führen mich leider nicht wirklich zum Ziel. Wobei 
ich annehme, dass es schlicht nicht so einfach geht, wie ich das gerne 
hätte. Ich erkläre das ganze jetzt noch etwas ausführlicher, falls es 
jemand interessiert:

Meine AVR-Library benutzt Fonts zwischen 8 und 64 Pixeln Höhe. Es können 
beliebige Schriften genutzt werden, sowohl proportionale als auch 
unproportionale. Nun werden diese Fonts natürlich schnell riesengroß, 
wenn sie alle Zeichen enthalten, zu groß jedenfalls für sinnvolle 
Nutzung auf dem AVR. Trotzdem fehlt dann doch immer wieder das eine oder 
andere Sonderzeichen.

Mein Ansatz ist nun, dass ich für jede Schriftgröße nur die Zeichen 
codiere, die im jeweiligen AVR-Projekt benötigt werden. Es können 
beliebige Sonderzeichen enthalten sein, solange sie im Windows Font 
enthalten sind. Da gibt es recht nützliche Zeichen und Pictogramme...

LCD Font Creator erzeugt eine Datei "fontname.c" welche (auf ein Zeichen 
gekürzt) so aussieht:
1
/*
2
 typedef struct {
3
     const uint8_t *data;
4
     uint16_t width;
5
     uint16_t height;
6
     uint8_t dataSize;
7
     } tImage;
8
 typedef struct {
9
     long int code;
10
     const tImage *image;
11
     } tChar;
12
 typedef struct {
13
     int length;
14
     const tChar *chars;
15
     } tFont;
16
*/
17
18
#include <stdint.h>
19
20
#if (0x0 == 0x0)
21
static const uint8_t image_data_tahoma24_0x20[21] = {
22
23
    0x00, 0x00, 0x00, 
24
    0x00, 0x00, 0x00, 
25
    0x00, 0x00, 0x00, 
26
    0x00, 0x00, 0x00, 
27
    0x00, 0x00, 0x00, 
28
    0x00, 0x00, 0x00, 
29
    0x00, 0x00, 0x00
30
};
31
static const tImage tahoma24_0x20 = { image_data_tahoma24_0x20,
32
    7, 24, 8};
33
#endif
34
35
static const tChar tahoma24_array[] = {
36
37
#if (0x0 == 0x0)
38
  // character: ' '
39
  {0x20, &tahoma24_0x20},
40
#else
41
  // character: ' ' == ''
42
  {0x20, &tahoma24_0x},
43
#endif
44
}
45
46
const tFont tahoma24 = { 136, tahoma24_array };

Diese Datei fontname.c benenne ich manuell in fontname.h um und include 
sie in mein Konvertier-Utility.
Außerdem include ich noch eine einfache Tabelle selectchars.h (mit Excel 
erstellt), in der für jeden Zeichencode von 0..255 der gewünschte 
Unicode zugewiesen wird oder, falls das Zeichen nicht benötigt wird, 
0x20.
Dadurch kann ich beispielsweise einen 48px Font erzeugen, der nur die 
Symbole 0..9, C, ° enthält, wenn eine große Temperaturanzeige benötigt 
wird.

Mein Konvertier-Utility erzeugt mir eine Font-Datei die so aussieht:
1
typedef struct {
2
  const uint8_t *data;
3
  const uint8_t width;
4
} tImage;
5
6
//Font tahoma24.h 
7
static const uint8_t image_data_tahoma24_0x20[]  PROGMEM = {
8
    // ascii 0x20
9
    0x00, 0x00, 0x00, 
10
    0x00, 0x00, 0x00, 
11
    0x00, 0x00, 0x00, 
12
    0x00, 0x00, 0x00, 
13
    0x00, 0x00, 0x00, 
14
    0x00, 0x00, 0x00, 
15
    0x00, 0x00, 0x00
16
};
17
static const tImage tahoma24_0x20 PROGMEM = {image_data_tahoma24_0x20, 7};
18
19
static const tImage* const charset24[] PROGMEM  = {
20
  &tahoma24_0x20,  // 0x20 ' '
21
  &tahoma24_0x21,  // 0x21 '!'
22
...
23
  &tahoma24_0x20  // 0xff 'ÿ'
24
};
Diese Datei kann ich in meiner Library verwenden. Nun geht es aber nicht 
um nur eine Font-Datei, weil die Library für jede benötigte Schriftgröße 
jeweils einen eigenen Font benutzen kann. Das jetzige Verfahren 
funktioniert, ist aber umständlich und fehleranfällig.

MaWins Vorschlag, fontname.c zur Laufzeit einzulesen und zu Parsen wäre 
mir mit recht viel Mühe möglich. Ich erinnere mich dunkel, dass diese 
Technik in vielfältiger Form als Übungen im K&R enthalten waren, den ich 
vor bald 30 Jahren bis Kapitel 5 durchgearbeitet habe, bevor ich C zu 
Teufelswerk erklärt habe, um es nie mehr anzufassen. Bis heute hat es 
gedauert, dieses Trauma zu überwinden. :)

Theor, den Source Code des 'LCD Font Converter' anzupassen, werde ich 
mit meinem Kenntnisstand nicht schaffen. Zumal das C++ ist. Wobei das 
natürlich klar der beste Weg wäre.

Die eigentlich Library funktioniert übrigens, jedenfalls wenn/falls ich 
sie mit den richtigen Fonts füttere. Ein Beispiel liegt bei.

von Mark B. (markbrandis)


Lesenswert?

Erwin E. schrieb:
> Zur Laufzeit möchte ich nun eine dieser C-Dateien zur Verarbeitung
> auswählen können.

Hat das einen tieferen Sinn, dass dies nicht zur Compile-Zeit geschehen 
darf?

von Johannes S. (Gast)


Lesenswert?

Wo sollen die Daten denn liegen die zur Laufzeit 'umgeschaltet' werden? 
Wenn die ins Flash passen, macht es nur Sinn die auch gleich zu 
kompilieren+linken. Wenn die in einem externen Flash oder SD Karte 
liegen, dann ist ein binärformat auch pratkischer.

von Rolf M. (rmagnus)


Lesenswert?

Mark B. schrieb:
> Erwin E. schrieb:
>> Zur Laufzeit möchte ich nun eine dieser C-Dateien zur Verarbeitung
>> auswählen können.
>
> Hat das einen tieferen Sinn, dass dies nicht zur Compile-Zeit geschehen
> darf?

Hat er doch geschrieben: Er möchte nicht für jeden Font, den er 
einbinden möchte bzw. jedes mal, wenn darin ein Zeichen geändert wird, 
sein Tool neu compilieren müssen.

Johannes S. schrieb:
> Wo sollen die Daten denn liegen die zur Laufzeit 'umgeschaltet' werden?
> Wenn die ins Flash passen, macht es nur Sinn die auch gleich zu
> kompilieren+linken.

Auf dem PC?

von Theor (Gast)


Lesenswert?

Erwin E. schrieb:
> Vielen Dank für die rege Beteiligung, [...]
>
> Theor, den Source Code des 'LCD Font Converter' anzupassen, werde ich
> mit meinem Kenntnisstand nicht schaffen. Zumal das C++ ist. Wobei das
> natürlich klar der beste Weg wäre.
>
> [...]

Dann würde ich raten, Lexas Vorschlag mit den Makefiles zu folgen. Das 
ist formal ein "sauberer" Weg.

Vermutlich kennst Du Dich allerdings mit Makefiles nicht so gut aus.

Nur muss man dazu sagen, dass Du letztlich irgendeine Kröte schlucken 
musst; will sagen: Um irgendwas "kompliziertes", sei es C++, Makefiles 
oder eben cling, Parser o.ä. kommst Du nicht herum, wenn Du die Methode 
ändern willst, so das sie universeller ist.

von leo (Gast)


Lesenswert?

Erwin E. schrieb:
> Ist es möglich, dass ein C-Programm (Visual C) zur Laufzeit eine weitere
> C-Datei mit Daten einbindet?

Ja. Stichworte sind dlopen bzw. LoadLibrary.

Ich bezweifle aber, dass das auf einem AtMega einsetzbar ist.

leo

von Dirk K. (merciless)


Lesenswert?

Warum verwendest du kein Binär-Format?
Alle Betriebssysteme haben solche Mechanismen
(Bsp: TrueType-Font unter Windows). Du
könntest selber eines entwickeln, das
auf deine Ansprüche optimiert ist oder
du suchst was existierendes.

merciless

von Mark B. (markbrandis)


Lesenswert?

Rolf M. schrieb:
> Hat er doch geschrieben: Er möchte nicht für jeden Font, den er
> einbinden möchte bzw. jedes mal, wenn darin ein Zeichen geändert wird,
> sein Tool neu compilieren müssen.

Dann ist der sinnvolle Weg doch wohl, in einem Verzeichnis fertig 
kompilierte Dateien für die Fonts liegen zu haben, und diese je nach 
Auswahl zur Laufzeit zu laden.

Zur Laufzeit etwas extra noch kompilieren zu wollen klingt jedenfalls 
ein wenig schräg.

: Bearbeitet durch User
von Erwin E. (kuehlschrankheizer)


Lesenswert?

Danke für alle Anregungen!

Ich werde mich an einem Parser versuchen. Eigentlich sollte das gar 
nicht so schwer sein, weil die Daten bereits weitgehend mundgerecht 
vorliegen.

von A. S. (Gast)


Lesenswert?

Erwin E. schrieb:
> Ich werde mich an einem Parser versuchen. Eigentlich sollte das gar
> nicht so schwer sein, weil die Daten bereits weitgehend mundgerecht
> vorliegen.

Ein Parser ist ohne entsprechende Erfahrung deutlich schwieriger, als 
einen C-Compiler (incl. Präprozessor) parsen zu lassen und die 
Informationen in einem C-Programm zu verarbeiten. Wenn es gar nicht 
anders geht, ist es auch kein Problem, die gesammelten und verarbeiteten 
Infos in einem C-Format wieder auszuspucken.

von cppbert (Gast)


Lesenswert?

Erwin E. schrieb:
> LCD Font Creator

Link?

von Erwin E. (kuehlschrankheizer)


Lesenswert?

cppbert schrieb:
> Erwin E. schrieb:
>> LCD Font Creator
>
> Link?

Steht im Eröffnnungsbeitrag. Ganz, ganz nach oben scrollen...

Die Software heisst korrekt "LCD Image Converter". Sorry, hab ich 
durcheinander gebracht. Das Programm erscheint mir teilweise etwas 
buggy, insbesondere der enthaltene Fonteditor, es ist aber trotzdem sehr 
gut nutzbar.

von cppbert (Gast)


Lesenswert?

Erwin E. schrieb:
> Die Software heisst korrekt "LCD Image Converter". Sorry, hab ich
> durcheinander gebracht. Das Programm erscheint mir teilweise etwas
> buggy, insbesondere der enthaltene Fonteditor, es ist aber trotzdem sehr
> gut nutzbar.

auf der Homepage steht:
1
The transformation of the images to the source code is made by using templates. Therefore, by modifying the templates, you can change the format of the output within certain limits.

warum machst du dir nicht ein einfaches Template das deine Daten simple 
ausspuckt?

von cppbert (Gast)


Lesenswert?

sieht nicht so schwer aus - und dann einen trivialen Parser dazu

https://www.riuson.com/lcd-image-converter/templates

von Joachim B. (jar)


Lesenswert?

Hannes J. schrieb:
> Nein, die Übung besteht darin mehrere der Font-Dateien in den Code zu
> kompilieren und zur Laufzeit durch einen noch zu wählenden Mechanismus
> (zum Beispiel einen Pointer auf die Datenstruktur), den gewünschten Font
> auszuwählen.

sollte doch machbar sein solange der flash reicht

fontdatatype SmallFont1[] PROGMEM =
fontdatatype SmallFont2[] PROGMEM =

extern uint8_t SmallFont1[];
extern uint8_t SmallFont2[];

myGLCD.setFont(SmallFont1);
myGLCD.setFont(SmallFont2);

muss man halt programmieren

von Erwin E. (kuehlschrankheizer)


Lesenswert?

cppbert schrieb:
> warum machst du dir nicht ein einfaches Template das deine Daten simple
> ausspuckt?

Berechtigte Frage...
Der Hauptgrund ist, dass ich es nicht geschafft habe, dass mir das 
Programm die Fontdaten in der korrekten Reihenfolge ausgibt.
Ich brauche die Daten eines Zeichens spaltenweise, also von links nach 
rechts und von oben nach unten. Das geht durchaus, nur musste ich die 
einzelnen Bytes noch spiegeln, damit sie korrekt angezeigt werden. Also 
Bit 0 wird Bit 7, Bit 1 wird Bit 6 etc. Das ist mir im Font Creator 
nicht gelungen. Ich kann da nur die 'Laufrichtung' ändern, also von oben 
nach unten oder anderstherum. Für das Oled hat aber keine Option 
gepasst.
Erst habe ich das Spiegeln der Bytes in meiner Ausgaberoutine gemacht. 
Das funktioniert, kostet aber unnötig Rechenzeit.

Außerdem brauche ich für jeden Font eine Tabelle zur Umsetzung ASCII - 
Unicode. Im Extremfall könnte ich einen Font mit nur einem einzelnen 
Zeichen in der Library verwenden, ohne dass ich bei den 
Ausgabefunktionen darauf Rücksicht nehmen müsste. Fehlt ein zeichen, 
wird ein Defaultzeichen benutzt. Diese Tabelle müsste ich ohnehin für 
jeden Font eigenständig erzeugen, da helfen mir auch die Templates nicht 
(glaube ich).

Meine Lib ist sinnfrei, wenn nur ein einzelner Font der Größe 8px mit 
den Standardzeichen gebraucht wird, weil jede Tabelle bereits 500 Bytes 
Flash Memory belegt. Bei größeren Fonts amortisiert sich das aber sehr 
schnell. Außerdem brauche ich so nur die Zeichen im Flash vorhalten, die 
im Projekt vorkommen. Und ich kann beliebige Sonderzeichen und 
Pictogramme verwenden und im Code einfach als Buchstaben schreiben. Oben 
auf dem Foto z.B. die Batterieanzeige oder den Lautsprecher.

Last not least, das ist mein erstes Projekt in C. Hat also durchaus auch 
den Zweck, mich in C einzuarbeiten. Rant: Wer sich die 
(nicht-)Stringverarbeitung in C ausgedacht hat, sollte mit Katzendreck 
erschossen werden. :)

von Erwin E. (kuehlschrankheizer)


Lesenswert?

cppbert schrieb:
> sieht nicht so schwer aus - und dann einen trivialen Parser dazu

Genau daran bastle ich gerade. Auch ein trivialer Parser ist für einen 
C-Anfänger nicht unbedingt trivial. ;)

von Rolf M. (rmagnus)


Lesenswert?

Erwin E. schrieb:
> cppbert schrieb:
>> warum machst du dir nicht ein einfaches Template das deine Daten simple
>> ausspuckt?
>
> Berechtigte Frage...
> Der Hauptgrund ist, dass ich es nicht geschafft habe, dass mir das
> Programm die Fontdaten in der korrekten Reihenfolge ausgibt.

Ich glaube, gemeint war nicht, dass die Daten direkt für den AVR 
ausgegeben werden sollen, sondern so, dass sie für dein Programm 
möglichst leicht zu parsen sind.

Erwin E. schrieb:
> Last not least, das ist mein erstes Projekt in C. Hat also durchaus auch
> den Zweck, mich in C einzuarbeiten. Rant: Wer sich die
> (nicht-)Stringverarbeitung in C ausgedacht hat, sollte mit Katzendreck
> erschossen werden. :)

Stringverarbeitung ist nicht grad die Stärke von C. Aber es war ja deine 
Wahl, ausgerechnet das zum Erlernen von C zu verwenden. Aber es hat auch 
was gutes: Wenn du damit klar kommst, hast du den schwierigsten Teil von 
C schon gemeistert - Pointer und Arrays.

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
Noch kein Account? Hier anmelden.