Forum: Compiler & IDEs Ein paar Fragen zu Strings in AVR-GCC


von Steffen O. (derelektroniker) Benutzerseite


Lesenswert?

Hallo,
ich habe vor die lcd-lib, die man hier im wiki finden kann um einer 
Laufschriftfunktion zu erweitern. Der Funtkionsaufruf soll irgendwie mit 
z.B. lcd_runningtext("Anzuzeigender Text","Welche Zeile","Wie viel 
Zeichen pro Zeile") stattfinden.
Gut, nun müsste ich den Text ja als String übergeben. Den String 
initialisieren kann ich ja z.B. mit unsigned char text[50] machen.

Nun kommen aber erste Fragen auf:
1. Wie kann ich zählen, wieviel Zeichen der übergebene String hat (Gibts 
da Funktionen wie strlen, oder muss ich irgendeinen Zähler einbauen, der 
z.B. bei jedem Schleifendurchlauf schaut, ob noch ein Zeichen kommt, und 
dann immer mitzählt?)

2. Jetzt nicht unbedingt zu dem Programm, aber wie kann ich einem String 
einfach ein Wort zuweisen? Wenn ich z.B. text='hallo'; schreibe, dann 
lässt mir mein C-Compiler (WinAVR Plugin in AVR Studio) das nicht 
durchgehen.

3.Brauch ich noch irgendwelchen libs, wenn ich mit Strings arbeite?

4.Gibt es dazu irgendwelche guten Tutorials, in denen ich das alles 
nachlesen kann? Im wiki hab ich jetzt explizit zu Strings nichts 
gefunden.

5.Gar nicht zu Strings: Wie kann ich der Funkton 
set_cursor("Spalte","Zeile") eine Variable übergeben? Also z.B.
....
int i;
i=5;
set_cursor(0,"Wie hier nun das i?");
....


So, das waren jetzt eigentlich alle, vielleicht fallen mir später ja 
noch irgendwelche Fragen ein.

Ach ja, die Laufschrift soll bei z.B. einem 8 Zeichen-Display (ist mir 
zwar nicht bekannt, dass es so was gibt, ist aber nicht so viel 
Tipparbeit hier fürs Bsp.) so sein:
(text[1],text[2],text[3],...usw. stellen jeweils ein Zeichen des Strings 
dar, der der Funktion übergeben wurde)

text[1],text[2],text[3],text[4],text[5],text[6],text[7],text[8]
text[2],text[3],text[4],text[5],text[6],text[7],text[8],text[ ]
text[3],text[4],text[5],text[6],text[7],text[8],text[ ],text[1]
text[4],text[5],text[6],text[7],text[8],text[ ],text[1],text[2]
                               u
                               s
                               w
                               ...

Vielen Dank schon einmal im voraus.
Gruß, Steffen

von Johannes M. (johnny-m)


Lesenswert?

Steffen O. wrote:
> Gut, nun müsste ich den Text ja als String übergeben. Den String
> initialisieren kann ich ja z.B. mit unsigned char text[50] machen.
Damit initialisierst Du gar nichts. Du deklarierst damit lediglich ein 
Array mit unsigned char-Werten. Und für Textzeichen (ASCII) ist 
unsigned char keine geschickte Wahl. Generell werden Textzeichen in C 
standardmäßig als char verwurstet. Auch Bibliotheksfunktionen, die mit 
Zeichenketten arbeiten, erwarten char und nicht unsigned char. Gibt 
sonst zumindest ne Warnung vom Compiler.

> Nun kommen aber erste Fragen auf:
> 1. Wie kann ich zählen, wieviel Zeichen der übergebene String hat (Gibts
> da Funktionen wie strlen,
Gibt es.

> oder muss ich irgendeinen Zähler einbauen, der
> z.B. bei jedem Schleifendurchlauf schaut, ob noch ein Zeichen kommt, und
> dann immer mitzählt?)
ASCII-Zeichenketten sind in C automatisch nullterminiert, d.h. wenn man 
eine Zeichenkette korrekt angibt (mit doppelten Anführungszeichen), 
dann wird automatisch am Ende noch eine 0 ('\0') eingebaut, weshalb eine 
Zeichenkette in C immer ein Zeichen mehr belegt als angegeben.

> 2. Jetzt nicht unbedingt zu dem Programm, aber wie kann ich einem String
> einfach ein Wort zuweisen? Wenn ich z.B. text='hallo'; schreibe, dann
> lässt mir mein C-Compiler (WinAVR Plugin in AVR Studio) das nicht
> durchgehen.
Damit hat der Compiler auch völlig recht! In einzelne Hochkommata wird 
ein einzelnes Zeichen eingeschlossen (also z.B. 'a' oder 'X'). Eine 
Zeichenkette wird in doppelte Anführungszeichen (also "String") 
eingeschlossen.

Außerdem gibt es in C keinen Datentyp string. Ein String (eine 
Zeichenkette) ist immer ein Array von char. Und ein Array kann man nicht 
als Ganzes zuweisen. Man kann nur bei der Initialisierung eines Arrays 
eine Zeichenkette als Initialisierungswert angeben. Also z.B.
1
char string[] = "Das ist ein String";

> 3.Brauch ich noch irgendwelchen libs, wenn ich mit Strings arbeite?
Sinnvoll ist zumindest, die Funktionen aus der string.h zu nutzen...

> 4.Gibt es dazu irgendwelche guten Tutorials, in denen ich das alles
> nachlesen kann? Im wiki hab ich jetzt explizit zu Strings nichts
> gefunden.
Das meiste, was offensichtlich unklar ist, steht in jedem guten C-Buch 
(z.B. K&R). Und ohne ein gutes Buch für die Basics wird es schwer...

von Steffen O. (derelektroniker) Benutzerseite


Lesenswert?

Hallo,
Vielen Dank schonmal für deine schnelle und ausführliche Antwort!!!!

Johannes M. wrote:
> Steffen O. wrote:
>> Gut, nun müsste ich den Text ja als String übergeben. Den String
>> initialisieren kann ich ja z.B. mit unsigned char text[50] machen.
> Damit initialisierst Du gar nichts. Du deklarierst damit lediglich ein
> Array mit unsigned char-Werten. Und für Textzeichen (ASCII) ist
> unsigned char keine geschickte Wahl. Generell werden Textzeichen in C
> standardmäßig als char verwurstet. Auch Bibliotheksfunktionen, die mit
> Zeichenketten arbeiten, erwarten char und nicht unsigned char. Gibt
> sonst zumindest ne Warnung vom Compiler.

Ok, danke für den Tip!!!

>> Nun kommen aber erste Fragen auf:
>> 1. Wie kann ich zählen, wieviel Zeichen der übergebene String hat (Gibts
>> da Funktionen wie strlen,
> Gibt es.

Und wie heißen die z.B.?

>> oder muss ich irgendeinen Zähler einbauen, der
>> z.B. bei jedem Schleifendurchlauf schaut, ob noch ein Zeichen kommt, und
>> dann immer mitzählt?)
> ASCII-Zeichenketten sind in C automatisch nullterminiert, d.h. wenn man
> eine Zeichenkette korrekt angibt (mit doppelten Anführungszeichen),
> dann wird automatisch am Ende noch eine 0 ('\0') eingebaut, weshalb eine
> Zeichenkette in C immer ein Zeichen mehr belegt als angegeben.

Ok, das mit den Anführungszeichen wusste ich auch noch nicht!

>> 2. Jetzt nicht unbedingt zu dem Programm, aber wie kann ich einem String
>> einfach ein Wort zuweisen? Wenn ich z.B. text='hallo'; schreibe, dann
>> lässt mir mein C-Compiler (WinAVR Plugin in AVR Studio) das nicht
>> durchgehen.
> Damit hat der Compiler auch völlig recht! In einzelne Hochkommata wird
> ein einzelnes Zeichen eingeschlossen (also z.B. 'a' oder 'X'). Eine
> Zeichenkette wird in doppelte Anführungszeichen (also "String")
> eingeschlossen.

Siehe oben.

> Außerdem gibt es in C keinen Datentyp string. Ein String (eine
> Zeichenkette) ist immer ein Array von char. Und ein Array kann man nicht
> als Ganzes zuweisen. Man kann nur bei der Initialisierung eines Arrays
> eine Zeichenkette als Initialisierungswert angeben. Also z.B.
>
1
> char string[] = "Das ist ein String";
2
>

>> 3.Brauch ich noch irgendwelchen libs, wenn ich mit Strings arbeite?
> Sinnvoll ist zumindest, die Funktionen aus der string.h zu nutzen...

Ok, werd ich dann noch einfügen...

>> 4.Gibt es dazu irgendwelche guten Tutorials, in denen ich das alles
>> nachlesen kann? Im wiki hab ich jetzt explizit zu Strings nichts
>> gefunden.
> Das meiste, was offensichtlich unklar ist, steht in jedem guten C-Buch
> (z.B. K&R). Und ohne ein gutes Buch für die Basics wird es schwer...

Ja, ich habe bis jetzt nur ein günstiges Buch für den Einstieg, was 
wirklich nur die Grundthemen behandelt, und außerdem C-allgemein ist, 
sich also nicht mit GCC befasst.

Gruß, Steffen

von Johannes M. (johnny-m)


Lesenswert?

Steffen O. wrote:
>>> da Funktionen wie strlen,
>> Gibt es.
>
> Und wie heißen die z.B.?
Hast Du doch selbst geschrieben! Und zur Bibliothek gibt es eine 
Dokumentation...

> Ja, ich habe bis jetzt nur ein günstiges Buch für den Einstieg, was
> wirklich nur die Grundthemen behandelt, und außerdem C-allgemein ist,
> sich also nicht mit GCC befasst.
Das ist allgemeines C! Der GCC ist ein ANSI-C-Compiler und hält sich 
dementsprechend auch an das, was in den allgemeinen Grundlagenbüchern 
steht. Es gibt nur einige µC-spezifische Erweiterungen. Die Funktionen 
aus der string.h gehören zum Funktionsumfang eines jeden 
ANSI-C-Compilers und sind dementsprechend auch im Standard sowie in 
Büchern, die sich auf den Standard beziehen (also z.B. K&R) 
dokumentiert. Klar, es gibt auch plattformspezifische Erweiterungen der 
Standard-Libs, aber der Grund-Funktionsumfang ist immer gegeben.

von Steffen O. (derelektroniker) Benutzerseite


Lesenswert?

Johannes M. wrote:
> Steffen O. wrote:
>>>> da Funktionen wie strlen,
>>> Gibt es.
>>
>> Und wie heißen die z.B.?
> Hast Du doch selbst geschrieben! Und zur Bibliothek gibt es eine
> Dokumentation...

Die Dokumentation zu lib hab ich bis jetzt noch nicht gefunden. Ich 
dachte eben dass der Befehl zum Zähen irgendwie anders sein würde, aber 
strlen funktioniert mit string.h gut.

>> Ja, ich habe bis jetzt nur ein günstiges Buch für den Einstieg, was
>> wirklich nur die Grundthemen behandelt, und außerdem C-allgemein ist,
>> sich also nicht mit GCC befasst.
> Das ist allgemeines C! Der GCC ist ein ANSI-C-Compiler und hält sich
> dementsprechend auch an das, was in den allgemeinen Grundlagenbüchern
> steht. Es gibt nur einige µC-spezifische Erweiterungen. Die Funktionen
> aus der string.h gehören zum Funktionsumfang eines jeden
> ANSI-C-Compilers und sind dementsprechend auch im Standard sowie in
> Büchern, die sich auf den Standard beziehen (also z.B. K&R)
> dokumentiert. Klar, es gibt auch plattformspezifische Erweiterungen der
> Standard-Libs, aber der Grund-Funktionsumfang ist immer gegeben.

Ach so, auch dies war mir nicht so bewusst. Ich dachte bei GCC sind auch 
einige Befehle anders.....

Also die Funktion ist jetzt fertig, aber sie funktioniert nicht richtig. 
Jetzt muss ich eben versuchen die noch irgendwie hinzubekommen......

Gruß, Steffen

von Johannes M. (johnny-m)


Lesenswert?

> Die Dokumentation zu lib hab ich bis jetzt noch nicht gefunden.
Bei der Installation von WINAVR wird die Dokumentation automatisch mit 
"installiert". Im Zweifelsfall "Start | Programme | WINAVRxxxxxxxx | 
avr-libc-Dokumentation"...

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.