Forum: Mikrocontroller und Digitale Elektronik Routine sprintf


von Maik (Gast)


Lesenswert?

Hat jemand eine Idee, wie ich eine variable Anzahl von Integer-Werten in 
einen einzelnen String einfüge (dieser wird anschließend mittels SCI 
gesendet).
Bei der Nutzung von sprintf kann man ja nur eine definierte Anzahl an 
Werten zum String hinzufügen. Diese Anzahl muss jedoch variabel 
gestaltet werden.
Gibt es irgendwo eine fertige Routine hierfür?

Danke schonmal

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Diese Anzahl muss jedoch variabel gestaltet werden.

Eine Möglichkeit bestünde darin, eine Funktion mit variabler 
Argumentenliste (...) zu verwenden und über die in stdarg.h definierten 
Funktionen va_start/va_end die Anzahl der Argumente zu bestimmen, daraus 
dynamisch den Formatstring durch ausreichend häufiges zusammenfügen von 
"%d " zu generieren. Der so erzeugte Formatstring wird dann vsprintf 
zusammen mit der von va_start erzeugten Argumentenliste übergeben.

Nur: Wozu braucht man sowas?

von Karl H. (kbuchegg)


Lesenswert?

Maik wrote:
> Hat jemand eine Idee, wie ich eine variable Anzahl von Integer-Werten in
> einen einzelnen String einfüge (dieser wird anschließend mittels SCI
> gesendet).
> Bei der Nutzung von sprintf kann man ja nur eine definierte Anzahl an
> Werten zum String hinzufügen. Diese Anzahl muss jedoch variabel
> gestaltet werden.
> Gibt es irgendwo eine fertige Routine hierfür?

itoa() macht dir die Konvertierung eines Wertes in einen
ASCII String. Das ganze dann in einer Schleife und die
Einzelteile mittels strcat zusammensetzen.

http://www.mikrocontroller.net/articles/FAQ#itoa.28.29
http://www.mikrocontroller.net/articles/FAQ#Wie_funktioniert_String-Verarbeitung_in_C.3F

von Karl H. (kbuchegg)


Lesenswert?

Oder aber natürlich:
Du sparst dir das zusammensetzen eines kompletten Strings
und bringst die Einzelteile nacheinander auf den Weg.

So in etwa

  int Werte[20];
  char Buffer[100];

  ....


  for( i = 0; i < 20; ++i ) {
    itoa( Werte[i], Buffer, 10 );
    TransmitString( Buffer );
    if( i != 19 )
      TransmitString( "," );
  }

ist die allereinfachste und resourcenschonendste Variante.

von Maik (Gast)


Lesenswert?

Danke Dir, das läuft----zwar mit sprintf--weil der compiler(iccarm) 
irgendwie itoa nicht kennt und noch irgendwie in einer 
Endlosschleife--:-(

Aber ansonsten hat es mir viel geholfen.

Gruß Maik

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.