Schleifendurchlauf

OP #1598974
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ß
Gast #1598985
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.
Gast #1599106
Stefan B. schrieb:
> <> ist wahrscheinlich ein Flüchtigkeitsfehler von  Matthias


Ja. Auf Arbeit programmiere ich in ST. Da ist <> das ungleich-Zeichen.
#1599116
...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
#1599128
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.
Gast #1599131
>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....

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.