Forum: Mikrocontroller und Digitale Elektronik Schleifendurchlauf


von Martin S. (mast4)


Lesenswert?

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ß

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ä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

von Matthias L. (Gast)


Lesenswert?

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.

von Martin S. (mast4)


Lesenswert?

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.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

<> ist wahrscheinlich ein Flüchtigkeitsfehler von  Matthias

Ändere
<>
in
!=

von Martin S. (mast4)


Lesenswert?

Danke hat funktioniert!

von Matthias L. (Gast)


Lesenswert?

Stefan B. schrieb:
> <> ist wahrscheinlich ein Flüchtigkeitsfehler von  Matthias


Ja. Auf Arbeit programmiere ich in ST. Da ist <> das ungleich-Zeichen.

von Ste N. (steno)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Matthias L. (Gast)


Lesenswert?

>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
Noch kein Account? Hier anmelden.