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
Vorausgesetzt, du hast ein ordentliches C-Buch, sollte hier eigentlich alles stehen: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial (Abschnitt 20.2 Programmspeicher (Flash))
@ 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
Genau, soll der doch mal das Tutorial vorlesen! Sonst hat er heute bestimmt nichts zu tun...
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
Naja, solche Stringsucherein würde ich mir schenken. Eher so, ohne Anspruch auf Vollständigkeit und Fehlerfreiheit.
1 | char d_1 ="Hallo"; |
2 | char e_1 ="Hello"; |
3 | |
4 | char d_2 ="Welt"; |
5 | char e_2 ="Welt"; |
6 | |
7 | char d_3 ="Blödsinn"; |
8 | char e_3 ="Bullshit"; |
9 | |
10 | char* deutsch[] = {d_1, d_2, d_3}; |
11 | char* englisch[] = {e_1, e_2, e_3}; |
12 | |
13 | char** sprache=deutsch[0]; |
14 | |
15 | printf("%s %s %s."sprache[0], sprache[1], sprache[2]); |
Falk Brunner schrieb: > ohne Anspruch auf Vollständigkeit und Fehlerfreiheit. Deswegen muss doch aber nicht gleich nahezu jede Zeile falsch sein (oder Absicht?) ;-)
1 | char d_1 ="Hallo"; |
2 | ->
|
3 | char d_1[] ="Hallo"; |
4 | |
5 | char** sprache=deutsch[0]; |
6 | ->
|
7 | char** sprache=&deutsch[0]; |
8 | oder schlicht |
9 | char** sprache=deutsch; |
10 | |
11 | printf("%s %s %s."sprache[0], sprache[1], sprache[2]); |
12 | ->
|
13 | printf("%s %s %s."(*sprache)[0], (*sprache)[1], (*sprache)[2]); |
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
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.