Guten Tag
Bei meinem Projekt(c, mdk5, Keil, stm32f4xx) geht es darum eine kleine
Bedienung zu erstellen. Es soll ein Display angesteuert werden. Die
Texte sollen in ein FRAM abgelegt werden. Da sechs Sprachen erforderlich
sind, dachte ich an ein 2D Array. Das Display hat 2 Zeilen, 16 Zeichen,
ASCII-Code. Um es einfach zu halten stelle ich mir folgendes vor:
Dies wäre die Struktur, die dann ins FRAM abgelegt wird. (Auszugsweise)
MC Bu schrieb:> Hast Du die Zeichen in den Ascii Code gewandelt für die Ausgabe?
Die Frage habe ich nicht verstanden. Die Zeichen sind doch bereits im
ASCII Code!?
MC Bu schrieb:> Die Texte sollen in ein FRAM abgelegt werden.
Wozu denn der Aufwand... Warum nicht einfach alle Texte ins Flash und
die der gewünschten Sprache direkt von da direkt auf den I²C oder
wasauchimmer ausgeben?
@ Dr. Sommer
Ja, diesbezüglich habe ich meine Meinung auch geändert. Die Texte werden
ja nicht mehr verändert und es muss nur darauf zugegriffen werden.
@Route66
MC Bu schrieb:> wie geb ich jetzt einzelne Zeichen des Strings aus?
So wie immer.
> Ich hab da einen> Knopf in der Leitung.>>
1
>for(x=0;x<=15;x++)
2
>{
3
>LCD_wr_Data(setup.txt_run_RunOpen[0][x]);
4
>}
5
>
Im Prinzip schon richtig.
Nur gibt man halt nicht einfach fix 15 Zeichen aus. Schliesslich sagt ja
kein Mensch, dass alle Texte 15 Zeichen lang sind.
C definiert, dass ein String genau dort zu Ende ist, wo sich das '\0'
Zeichen befindet.
Also
1
x=0;
2
while(setup.txt_run_RunOpen[0][x]!='\0')
3
{
4
LCD_wr_Data(setup.txt_run_RunOpen[0][x]);
5
x++;
6
}
oder ein wenig intelligenter unter Verwendung der Pointer-Schreibweise
1
constchar*ptr=&setup.txt_run_RunOpen[0][0];
2
3
while(*ptr!='\0')
4
LCD_wr_Data(*ptr++);
> so erhalte ich nur schwarze Zeichen auf dem Display!
Wenn dein allererstes Original funktioniert hat, dann muss auch das
gehen.
char str[8] = "test";
ist schliesslich auch nichts anderes als
str[0] = 't';
str[1] = 'e';
str[2] = 's';
str[3] = 't';
str[4] = '\0';
nur dass der Compiler die ganze Arbeit für dich in der
Initialisierungsphase macht.
Stimmt, hab ich nicht compiliert. Dies bedeutet ich muss den String bei
der definition initialisieren. Oder ich kann nur einzelne Zeichen laden?
1
Setup.startup_Text_line1[0][0]='M';
Ich möchte aber alle Textelemente in einem Struct vereinen. Wie kann ich
dies lösen?
Ansonsten funktioniert es so sehr gut.
Vielen, vielen Dank!
Grüsse
MC Bu
MC Bu schrieb:> Stimmt, hab ich nicht compiliert. Dies bedeutet ich muss den String bei> der definition initialisieren.
Es ist das vernünftigste.
> Oder ich kann nur einzelne Zeichen laden?
Kannst du auch. Aber dann ist es erstens keine Initalisierung mehr und
zweitens machst du dir eine Menge Arbeit
>
1
>Setup.startup_Text_line1[0][0]='M';
2
>
kann man machen. Man kann aber auch
strcpy( Setup.startup_Text_line1[0], "Meine Idee" );
machen :-)
Ist ein bischen einfacher.
Vielleicht solltest du doch erst mal im C-Buch deiner Wahl nachlesen,
wie Stringverarbeitung in C überhaupt funktioniert?
> Ich möchte aber alle Textelemente in einem Struct vereinen. Wie kann ich> dies lösen?
Genau so, wie das da oben gemacht wurde.
Karl Heinz schrieb:> kann er recht offensichtlich nicht sein. Das compiliert nämlich mit> Sicherheit nicht. Du kannst nicht setup.txt_run_RunOpen einzeln> initialisieren.
man kann aber
Ich kann aber nicht die Stringkette in einem Struct anlegen und
gleichzeitig initialisieren!
1
typedefstruct{
2
size_tSetupVersion;
3
charstartup_Text_line1[STRING_LENGTH];
4
}
5
tSetup;
Ausser wie es Dr.Sommer vorgemacht hat! Dies würde ja Sinn machen, da
ich den struct nur für die Texte anlege. Diese Lösung finde ich
praktikabel.
Das beste wird es sein, ich lese über struct ebenfalls nach. ich
beschäftige mich leider bisschen zu wenig mit c.
Vielen Dank für Eure Hilfe!
Grüsse
MC Bu
MC Bu schrieb:> ich beschäftige mich leider bisschen zu wenig mit c.
Keep it simple - am Anfang. Optimieren kannst Du immer noch. Hauptsache
Du hast erstmal was am Laufen.
MC Bu schrieb:> Ich kann aber nicht die Stringkette in einem Struct anlegen und> gleichzeitig initialisieren!
Wo genau machst du das denn?
> Ausser wie es Dr.Sommer vorgemacht hat!
Ja, genau das ist ja auch der Normalfall.
> Das beste wird es sein, ich lese über struct ebenfalls nach. ich> beschäftige mich leider bisschen zu wenig mit c.
Sieht fast danach aus.
MC Bu schrieb:> Jetzt siehts bei mir so aus:
Das klappt nicht. Zuweisungen von structs gehen in C nicht. Nur
initialisierungen, wie ich sie oben gezeigt hab. Wenn deine Texte im
Flash sind, kannst du sie eh nicht ändern/zuweisen. Braucht man ja auch
nicht, da 1x initialisieren und im Read-Only-Flash zu lassen ja reicht.
Uhps, falsch gelesen, das ist ja die Initialisierung einer lokalen
Variable... Das geht, ist aber wenig sinnvoll da ineffizient. Und die
globale "Text" Variable wird gar nicht verwendet...