Hallo,
ich nutze einen Atmega 256 und den Codevisioncompiler. Nun möchte ich
für meinem Board ein Programm erstellen, bei dem man zur Laufzeit die
Sprache des Menüs umstellen kann.
Ich habe mir das in etwas so gedacht:
Ich habe eine Variable "Sprachnummer", die wie folgt belegt ist 1=
deutsch, 2= englisch, 3= spanisch
zusätzlich habe ich in einer zentralen Header-Datei meine String-Arrays
die so aussehen:
Hello = { "Hallo", "Hello","Hola"}
Nun möchte ich die printf-Funktion in etwa so aufrufen:
printf(Hello[2]);
ACHTUNG, ich weiß, dass mein Syntax nicht korrekt so ist. Das sollte nur
ausdrücken, wie ich es mir in etwa gedacht habe.
Hier meiner Fragen:
1.Würde das so funktionieren, ich meine vom Gedanken hier, nicht vom
konkreten Syntax?
2.Wie sieht es vom Speicherverbrauch aus? Wie muss ich es schreiben,
damit die einzelnen String-Arrays mit den Übersetzungen im Flash
gespeichert wird?
3.Hat irgendwer einen besseren Vorschlag?
4.Könnt ihr mir etwas mit dem Syntax helfen?
DANKE
@ stefanie (Gast)
>Nun möchte ich die printf-Funktion in etwa so aufrufen:>printf(Hello[2]);>1.Würde das so funktionieren, ich meine vom Gedanken hier, nicht vom>konkreten Syntax?
Ja.
>2.Wie sieht es vom Speicherverbrauch aus? Wie muss ich es schreiben,>damit die einzelnen String-Arrays mit den Übersetzungen im Flash>gespeichert wird?
Siehe das letzte Posting.
>3.Hat irgendwer einen besseren Vorschlag?
Nö.
>4.Könnt ihr mir etwas mit dem Syntax helfen?
Das macht das Tutorial und ein C-Buch deiner Wahl. Natürlich gibt es
mehrere Möglichkeiten, das zu lösen. Und gerade bei vielen Texten muss
man sich was gescheites ausdenken, um nicht in Tipparbeit und Chaos zu
versinken. Wahrscheinlich muss man ein wenig mit Pointern
experimentieren, bzw. Pointerarrays. Ich übergebe mal an Karl Heinz ;-)
MFG
Falk
Da es sich hierbei um Arrays (alle Elemente haben die gleiche Größe)
handelt, werden die Elemente auf gleiche Größe (des größten Elements)
aufgefüllt, bei
> Hello = { "Hallo", "Hello","Hola"}
wären das 6 Bytes (abschließendes Null-Byte mit eingerechnet),
dadurch kann der Compiler bei
> printf(Hello[2]);
den absoluten Offset (12 Bytes) vom Anfang des Arrays errechnen.
Wenn die Texte der einzelnen Sprachen sehr unterschiedlich lang sind,
dann führt das zu einer ziemlichen Speicherplatzverschwendung.
Eine Alternative wäre, für jede Sprache, eine Liste mit Einzelstrings,
aus der, der jeweils benötigte rausgesucht wird(4.Text englisch oder
4.Text spanisch), dafür müsste die jeweilige Liste bis zum 3. Nullbyte
durchsucht werden, darauf folgt der 4.Text.
printf(Searchlist(2 /*Sprache*/ ,4 /*Textnummer*/ ));
wenn die SearchList-Funktion die Adresse des gesuchten Strings
zurückliefert.
Wenn abzusehen ist, das genug Codespeicher das ist (weis, ist am Anfang
schwer), würd ich mich auch für die erste Variante entscheiden.
mfG ingo
Falk Brunner schrieb:> ohne Anspruch auf Vollständigkeit und Fehlerfreiheit.
Deswegen muss doch aber nicht gleich nahezu jede Zeile falsch sein (oder
Absicht?) ;-)
Hi,
>Codevisioncompiler
schau dir mal das Schlüsselwort "flash" an.
In den Stringfunktionen, wird erklärt wie das Schlüsselwort
funktioniert.
Ist zwar schon länger her, das ich mit Codevision programmiert habe,
aber du brauchst da keine großen Klimmzüge zu machen.
Den Link von Klaus Wachtler einfach mal anschauen und gut sein lassen,
dann das Handbuch vom Codevison nehmen und nach flash suchen.
Stephan
Habe mal kurz skizziert, wie ich das vorhin gemeint habe und auf dem PC
getestet. Das herausfischen eines Strings aus einer der Listen sollte
auch in wenigen Mikrosekunden erledigt sein, wenn nicht gerade
ZichTausende davon enthalten sind.
mfG ingo