www.mikrocontroller.net

Forum: Compiler & IDEs Mehrsprachig mit Arrays programmieren


Autor: stefanie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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))

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau, soll der doch mal das Tutorial vorlesen!
Sonst hat er heute bestimmt nichts zu tun...

Autor: Ingo W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, solche Stringsucherein würde ich mir schenken. Eher so, ohne 
Anspruch auf Vollständigkeit und Fehlerfreiheit.

char d_1 ="Hallo";
char e_1 ="Hello";

char d_2 ="Welt";
char e_2 ="Welt";

char d_3 ="Blödsinn";
char e_3 ="Bullshit";

char* deutsch[] = {d_1, d_2, d_3};
char* englisch[] = {e_1, e_2, e_3};

char** sprache=deutsch[0];

printf("%s %s %s."sprache[0], sprache[1], sprache[2]);

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:
> ohne Anspruch auf Vollständigkeit und Fehlerfreiheit.

Deswegen muss doch aber nicht gleich nahezu jede Zeile falsch sein (oder 
Absicht?) ;-)
char d_1 ="Hallo";
->
char d_1[] ="Hallo";

char** sprache=deutsch[0];
->
char** sprache=&deutsch[0];
oder schlicht
char** sprache=deutsch;

printf("%s %s %s."sprache[0], sprache[1], sprache[2]);
->
printf("%s %s %s."(*sprache)[0], (*sprache)[1], (*sprache)[2]);

Autor: Stephan W. (sir_wedeck)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Ingo W. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.