Forum: Compiler & IDEs eigenes printf --> funktioniert nur mit args


von Michael (Gast)


Angehängte Dateien:

Lesenswert?

Hallo
ich habe eine vorhandene printf routine portiert um die ausgaben meines 
UARTS in printf style zu benutzen...
ich fuehre meine testroutine aus und das meiste funktioniert:
was nicht geht ist, wenn kein 2. argument im aufruf ist:
printf("%s\n\n", ptr);        --> funktioniert
printf("kleiner test\n",0);   --> funktioniert aber 0 sinnlos
printf("kleiner test2\n");    --> keine ausgabe
jemand ne idee?

thx

von Karl H. (kbuchegg)


Lesenswert?

Das hier
1
/* assuming sizeof(void *) == sizeof(int) */
2
3
int printf(const char *format, ...)
4
{
5
  register int *varg = (int *)(&format);
6
  return print(0, varg);
7
}
kommt mir dann doch sehr brutal vor.

Das hätte ich so nicht erwartet.

Was mich stutzig macht. Du arbeitest mit variadischen Funktionen, in 
deinem ganzen Code kommt aber nirgends va_list, va_start, va_end vor.

Hast du den Code aus einer vertrauenswürdigen Quelle?

von Peter (Gast)


Lesenswert?

Warum nimmst Du nicht die vorhandene printf Funktion aus der C-lib 
<io.h>

von Karl H. (kbuchegg)


Lesenswert?

Karl heinz Buchegger schrieb:

> Das hätte ich so nicht erwartet.

Um das näher auszuführen.
Erwartet hätte ich
1
#include <stdarg.h>
2
3
static int print(char** out, const char* format, va_list varg)
4
{
5
  ....
6
}
7
8
int printf(const char* format, ...)
9
{
10
  int retVal;
11
  va_list arguments;
12
13
  va_start( arguments, format );
14
  retVal = print( NULL, format, arguments );
15
  va_end( arguments );
16
17
  return retVal;
18
}
19
20
int sprintf(char* out, const char* format, ...)
21
{
22
  int retVal;
23
  va_list arguments;
24
25
  va_start( arguments, format );
26
  retVal = print( out, format, arguments );
27
  va_end( arguments );
28
29
  return retVal;
30
}

und in print dann Zugriff über va_arg, wenn im Formatstring ein % 
auftaucht.

von Michael (Gast)


Lesenswert?

Hallo,
erstmal Danke fuer die schnellen antworten.
habe das mit den va_list, va_start, va_end getestet aber es hat nicht so 
wirklich hingeheauen.
Jedoch frage ich mich selbst wieso ich nicht auf die idee gekommen bin 
die eigentlich printf umzulegen.
Nach entfernen dmeiner routinen und umlegen der eingebauten printf hat 
alles einwandfrei funktioniert!
Nachmal herzlichen Dank!

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.