Hallo, ich habe ein Problem bei meinem Projekt wo ich einen Analogwert einlese und diesen Wert über ein Terminal ausgebe. Hier mal der Code dazu: void Wert(float wert) { char ascii[50]; int8 i; sprintf(ascii,"Analogwert %3.1f V",wert); For (i=0;i<16;i++) { putc(ascii[i]); } } Das Problem ist das ich nicht weis wie lang dieser Wert ist und gib in der Schleife einfach mal 16 an. Wenn der Wert aber kürzer ist z.B. bei 0.0 werden mir unnötige Nullen angezeigt. Ich habe die For-Schleifenbedingung auch schon anderst geschrieben aber beides hat nicht funktioniert: For (i=0;i<=ascii.length();i++) oder For (i=0;ascii[i]=='V';i++). Gibt es noch eine Möglichkeit die Länge abzufragen und was ist bei den beiden Varianten falsch? Gruß
Ändere For (i=0;i<16;i++) in for (i=0;i<strlen(ascii);i++) Falls noch nicht eingebunden, mache noch folgendes Include zu Beginn der Quelldatei in der strlen() benutzt wird. #include <string.h> http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/strlen.html
1 | void Wert(float wert) |
2 | {
|
3 | char ascii[50]; |
4 | int8 i; |
5 | sprintf(ascii,"Analogwert %3.1f V",wert); |
6 | i=0; |
7 | while ( ascii[i] <> 0 ) |
8 | {
|
9 | putc( ascii[i++] ); |
10 | }
|
11 | }
|
oder, falls diese Nullterminierung als letztes mitgesendet werden soll:
1 | void Wert(float wert) |
2 | {
|
3 | char ascii[50]; |
4 | int8 i; |
5 | sprintf(ascii,"Analogwert %3.1f V",wert); |
6 | i=0; |
7 | do
|
8 | {
|
9 | putc( ascii[i] ); |
10 | }
|
11 | while ( ascii[i++] <> 0 ); |
12 | }
|
strlen würd ich nicht nehmen, da das letztendlich zwei Schleifen über dasselbe produziert.
Danke für die schnelle Antwort! Ich bin mit C nicht so vertraut, was bedeutet der Operator '<>' weil bei mir wird eine Fehlermeldung dabei angezeigt.
Stefan B. schrieb:
> <> ist wahrscheinlich ein Flüchtigkeitsfehler von Matthias
Ja. Auf Arbeit programmiere ich in ST. Da ist <> das ungleich-Zeichen.
...oder gleich in
1 | while ( ascii[i] ) |
Wenn beim Auslesen von ascii[i] eine 0 erscheint (Stringendezeichen) wird die Schleife abgebrochen. Aber wahrscheinlich wird der Compiler aus
1 | while ( ascii[i] ) |
und
1 | while ( ascii[i++] != 0 ) |
eh den selben Code erzeugen. Viele Grüße, Steffen
Das Vernünftigste wäre es allerdings, sich einen kleinen Baukasten zurechtzulegen (und bei der Stringausgabe auf die Indexschreibweise zu verzichten. Braucht kein Mensch)
1 | void putc( char c ) |
2 | {
|
3 | ...
|
4 | }
|
5 | |
6 | void puts( const char* s ) |
7 | {
|
8 | while( *s ) |
9 | putc( *s++ ); |
10 | }
|
11 | |
12 | void putf( float wert ) |
13 | {
|
14 | char buffer[10]; |
15 | |
16 | sprintf( buffer, "%f", wert ); |
17 | puts( buffer ); |
18 | }
|
19 | |
20 | void puti( int wert ) |
21 | {
|
22 | char buffer[10]; |
23 | |
24 | sprintf( buffer, "%d", wert ); |
25 | puts( buffer ); |
26 | }
|
So ist man dann für alle Fälle gerüstet und muss das Rad nicht immer neu erfinden. Eine Stringausgabe braucht man sowieso praktisch immer und warum soll man die nicht für die Ausgabe von ... äh ... Strings gleich mitbenutzen.
>So ist man dann für alle Fälle gerüstet und muss das Rad nicht immer neu >erfinden. Tja.. Das machen wir auf Arbeit seit Jahren. Nur leider wird das immer eckiger....
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.