mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Schleifendurchlauf


Autor: Martin S. (mast4)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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/FUNCTION...

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void Wert(float wert)
{
char ascii[50];
  int8 i;
  sprintf(ascii,"Analogwert %3.1f V",wert);
  i=0;
  while ( ascii[i] <> 0 )
  {
    putc( ascii[i++] );
  }
}

oder, falls diese Nullterminierung als letztes mitgesendet werden soll:
void Wert(float wert)
{
char ascii[50];
  int8 i;
  sprintf(ascii,"Analogwert %3.1f V",wert);
  i=0;
  do
  {
    putc( ascii[i] );
  }
  while ( ascii[i++] <> 0 );
}

strlen würd ich nicht nehmen, da das letztendlich zwei Schleifen über 
dasselbe produziert.

Autor: Martin S. (mast4)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
<> ist wahrscheinlich ein Flüchtigkeitsfehler von  Matthias

Ändere
<>
in
!=

Autor: Martin S. (mast4)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke hat funktioniert!

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan B. schrieb:
> <> ist wahrscheinlich ein Flüchtigkeitsfehler von  Matthias


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

Autor: Steffen N. (steno)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...oder gleich in
while ( ascii[i] )

Wenn beim Auslesen von ascii[i] eine 0 erscheint (Stringendezeichen) 
wird die Schleife abgebrochen.

Aber wahrscheinlich wird der Compiler aus
while ( ascii[i] )
und
while ( ascii[i++] != 0 )
eh den selben Code erzeugen.

Viele  Grüße,
Steffen

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)
void putc( char c )
{
 ...
}

void puts( const char* s )
{
  while( *s )
    putc( *s++ );
}

void putf( float wert )
{
  char buffer[10];

  sprintf( buffer, "%f", wert );
  puts( buffer );
}

void puti( int wert )
{
  char buffer[10];

  sprintf( buffer, "%d", wert );
  puts( buffer );
}

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.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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....

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.