mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik sprintf > Formatstring an Funktion übergeben


Autor: Andreas Häusler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen
Hab aktuell das Problem, dass ich für eine Datenausgabe an einen
Drucker eine formatierte Ausgabe benötige.

Hab mir folgendes ausgedacht:

void print(char *format_string, ...)
{
  char string[50];
  unsigned char string_laenge;

  sprintf(string,format_string);
  string_laenge=strlen(string);
  usw...
  print_data(string);   // Ausgabe auf Drucker
}

ein Aufruf würde dann zBsp. so aussehen:

a=7;
print"!Testausdruck!\n";
print("%03d",a);

anscheinend wird der Funktion nur der String "&03d" übergeben
der Wert der Variable(n) verscheindet dabei.

Weiss jemand Rat, wie ich den gesamten Formatstring inkl. Parameter
an eine Funktion übergeben kann.

Hab mir das ganze mit va_list argp bla,bla,bla angeschaut hab aber
dabei nicht den Durckblick.

Das folgende Beispiel scheint zu funktionieren, finde ich aber nicht
sonderlich elegant:

sprintf(string,"%03d",a); print_data(string);

Für eine rasche Antwort bin ich euch sehr dankbar!

Gruss Andy

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau dir das Thema varargs an ;-)

http://www.eskimo.com/~scs/cclass/int/sx11b.html

Autor: Andreas Häusler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Stefan

Herzlichen Dank für die rasche Antwort und den informativen Link.
Scheint doch keine "einfache" Lösung zu geben.
Werd mal schauen, ob ich die Zeit finde das auszuprobieren.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kennt die Library des von Dir verwendeten Compilers kein vsprintf bzw.
vsnprintf?

Das sind Varianten für den Gebrauch mit eben jenen variablen
Argumentenlisten, so daß man mit denen eigene printf-Varianten
schreiben kann.

Das sähe dann so aus:

  void mein_printf(char* format, ...)
  {
    va_list argptr;
    char buffer[BUFFERSIZE];

    va_start(argptr, format);

    _vsnprintf(buffer, BUFFERSIZE - 1, format, argptr);

    // irgendwas mit "buffer" anstellen
  }

Autor: Andreas Häusler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Rufus

Hab mal für eine formatierte Ausgabe auf ein LCD (serielle
Schnittstelle geht natürlich bei entsprechender Anpassung
der putchar Routine auch) sowas geschrieben:

//--------------------------------------------------

void putchar_lcd (unsigned char c)
{
 write_LCD(c);
}

// ---------------

static void put_one_char(char c, void *dummy)
  {
    dummy=0;
  putchar_lcd (c);
  }

// ----------------

short dprintf_XY (unsigned char x,unsigned char y,const char *format,
...)
  {
    va_list ap;
    int nr_of_chars;

    goto_XY(x,y);
    va_start (ap, format);  /* Variable argument begin */
    nr_of_chars = _formatted_write (format, put_one_char, (void *) 0,
ap);
    va_end (ap);    /* Variable argument end */
    return (nr_of_chars);  /* According to ANSI */
  }

//-------------------------------------------------

meinst Du man könnte das ganz soweit umschreiben, das nicht
nur einzelne Zeichen, sondern ganze Strings ausgegeben werden
könnten.
Für meine Druckerausgabe per IRDA- Schnittstelle muss
ich die ganzen Datenpackete nämlich noch in ein einfaches Protokoll
verpacken. (STX, Laenge, Daten Checksumme usw.)

Gruss Andy

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tut mir leid, aber die Frage verstehe ich nicht.

Auch weiß ich nicht, was _formatted_write() ist.

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.