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


von Andreas Häusler (Gast)


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

von Stefan (Gast)


Lesenswert?

Schau dir das Thema varargs an ;-)

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

von Andreas Häusler (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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
  }

von Andreas Häusler (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Tut mir leid, aber die Frage verstehe ich nicht.

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

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.