Hallo Leute,
also ich grübel seit geraumer Zeit über ein für mich großes Problem.
Mein ATmega256 soll ein Display in verschiedenen Sprachen bedienen.
Stellt der Benutzer auf Englisch, so soll alles in Englisch angezeigt
werden, analog in Deutsch.
Nun habe ich mich verschiedene Lösungen überlegt, allerdings ist jede
eine Krücke.
Methode a: ich lege für jede Displayausgabe eine Deutsche bzw. Englische
Konstante an z.B. const char text1_d[] = "Ausgabe"; bzw. const char
text1_d[] = "output"; und abhängig einer if-Abfrage wird die eine oder
andere Variable ausgegeben. Allerdings wird das ruck zuck
unübersichtlich
Methode b: ich lege ein Array an z.B. const char text1[] = "Ausgabe
output "; und abhängig einer if-Abfrage gebe ich den ersten oder den
zweiten Teil des Arrays aus. Das wiederrum könnte meinen Arbeitsspeicher
schnell sprengen.
Hat jemand eine praktikable Idee?
Danke vorab.
Jens
ja zweidimensionales Arry ist die Optimierung der Variante b, allerdings
steht dann doch immer alles im Ram oder sehe ich das flasch? Und genau
da sehe ich das Problem, wenn der µC auch noch die SD-Karte bedienen und
seine Messaufgaben abwarten soll.
Es gibt sicher eine viel elegantere Möglichkeit, nur wissen wie ist mal
wieder Problem ...
Jens schrieb:> ja zweidimensionales Arry ist die Optimierung der Variante b, allerdings> steht dann doch immer alles im Ram oder sehe ich das flasch?
Benutzt du den IAR Compiler (wegen dem const. Beim IAR legt der das dann
IMHO ins Flash. Dem gcc ist das const wiederrum sowas von egal. Kommt
trotzdem ins SRAM [und natürlich auch ins Flash])
Hast du noch genug Platz im Flash?
Karl heinz Buchegger schrieb:> Hast du noch genug Platz im Flash?
Das Problem beim 2D Array ist, dass alles Strings dann gleich lang sein
müssen. Und das kann unter Umständen auf viele Leerzeichen bzw.
unbenutzte Bytes rauslaufen
1
structTextEntry
2
{
3
constchar*German;
4
constchar*English;
5
};
6
7
structTextEntryTexte[]=
8
{
9
{"Menüpunkt 1","Menu 1"},
10
{"Beenden","Exit"},
11
...
12
};
Hier hast du die Kosten von 2 zusätzlichen Pointern pro Menüpunkt.
Wenn du dir das im Flash erlauben kannst ....
Andere Möglichkeit wäre wieder nur 1 Array von Strings zu haben, aber
die Sprachtrennung durch ein Sonderzeichen im Text zu realisieren.
Diese Methode ist gar nicht mal so schlecht, weil man dann oft mittels
Spezialfunktionen ausgeben kann, die sich anhand der Spracheinstellung
den richtigen Teil aus dem Text rausholen. D.h. die Umschaltung der
Sprache wirkt sich nur in einem kleinen Codeteil aus und ist nicht quer
über das komplette Programm verstreut.
>allerdings steht dann doch immer alles im Ram
Wer sagt das? Bei CodevisionAVR werden Konstanten direkt aus dem Flash
gelesen, ohne erst ins RAM geladen zu werden:
"VERY EFFICIENT USE OF RAM: Constant character strings are stored only
in FLASH memory and aren't copied to RAM and accessed from there, like
in other compilers for the AVR"
http://www.hpinfotech.ro/html/cvavr_features.htm
Wenn dein Compiler das nicht kann, musst du halt selber eine
entsprechende Funktion schreiben oder einen besseren Compiler verwenden.
Wieso eigentlich nicht einfach zwei String-Arrays ( also char**) in
einem die englischen, im anderen die deutschen. Am Programmanfang
einfach einer Pointervariable über die man ab da auf das Array zugreifen
will eines der Arrays zuweisen?
Gruß
Tom
Karl heinz Buchegger schrieb:> Andere Möglichkeit wäre wieder nur 1 Array von Strings zu haben, aber>> die Sprachtrennung durch ein Sonderzeichen im Text zu realisieren.
Karl Heinz hat schon einen sehr guten Ansatz geliefert.
Allerdings würde ich ein Stringarray mit "Offset" erstellen.
Am Beginn stehen z. B. die deutschen Texte und ab "Offset" die
englischen Texte. Bei der Sprachauswahl reicht es dann den Offset zu
setzen und du kannst Deinen Texte immer mit Index+Offset lesen.
Gruss Eduard
AED schrieb:> Karl Heinz hat schon einen sehr guten Ansatz geliefert.> Allerdings würde ich ein Stringarray mit "Offset" erstellen.> Am Beginn stehen z. B. die deutschen Texte und ab "Offset" die> englischen Texte. Bei der Sprachauswahl reicht es dann den Offset zu> setzen und du kannst Deinen Texte immer mit Index+Offset lesen.>> Gruss Eduard
da werden ja ein Haufen Bytes für die Leerzeichen verbraten.
Thomas Burkhart schrieb:> Wieso eigentlich nicht einfach zwei String-Arrays ( also char**) in> einem die englischen, im anderen die deutschen. Am Programmanfang> einfach einer Pointervariable über die man ab da auf das Array zugreifen> will eines der Arrays zuweisen?
Prinzipiell ja. Was mir daran nicht gefällt ist, dass die
Stringdefinitionen zu Wartungs- und Erweiterungszwecken
auseinandergerissen werden. D.h. der zum deutschen gehörende englische
Text ist optisch im Code weit, weit weg.
Karl heinz Buchegger schrieb:> Prinzipiell ja. Was mir daran nicht gefällt ist, dass die> Stringdefinitionen zu Wartungs- und Erweiterungszwecken> auseinandergerissen werden. D.h. der zum deutschen gehörende englische> Text ist optisch im Code weit, weit weg.
Das schon, aber wenn man die Konstantendefinitioen beieinander hat und
es nicht 100 Texte sind schon handlen.
Dafür ist der Zugriff viel klarer und nicht durch die Sprachauswahl
verunstaltet.
Gruß
Tom
Ich hab irgendwo gelesen, dass eine SD-Karte Teil des Projekts
ist...warum nicht da einrach eine Datei ablegen, und dann den Controller
aus dieser lesen lassen? Dann braucht man sich nicht um den Flash des
Controllers zu kümmern.
Der zweite vorteil ist, dass man die Texte dann einfacher bearbeiten
kann, indem man einfach die Karte in den Rechner steckt (vom rechner
lesbares Dateisystem vorausgesetzt) und die Datei bearbeitet, anstatt
dem kompletten Quellcode nochmal auf den Controller zu schreiben.
Eine eigene Frage?
Dieser Thread ist über 16 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.