Forum: Compiler & IDEs Mehrsprachig mit Arrays programmieren


von stefanie (Gast)


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

von Klaus W. (mfgkw)


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))

von Falk B. (falk)


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

von Klaus W. (mfgkw)


Lesenswert?

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

von Ingo W. (Gast)


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

von Falk B. (falk)


Lesenswert?

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]);

von Stefan E. (sternst)


Lesenswert?

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]);

von Stephan W. (sir_wedeck)


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

von Ingo W. (Gast)


Angehängte Dateien:

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

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.