eigenes pseudo printf() fehler bei long double und algemeine fragen dazu
-
fugitivus@fugitivus:~/workspace$ g++ -o main main.cpp time.c -Wall main.cpp: In Funktion »int main(int, char**)«: main.cpp:283:7: Warnung: Variable »chr« wird nicht verwendet [-Wunused-variable]fugitivus@fugitivus:~/workspace$ ./main Variablen: HalloWelt! HalloWelt! CHAR # CHAR # INT 123 INT 123 uINT 123 > 173 > 7b > 7B uINT 123 > 173 > 7b > 7B LONG DBL 123.321 > 123.321000 > 1.233210E+02 LONG DBL -0 > -0.000000 > -0.000000E+00 DBL 123.321 > 1.233210E+02 > 1.23e+02 DBL 123.321 > 1.233210E+02 > 1.23e+02 sINT 123 sINT 123 lINT 123 lINT 123 Speicher Addressen: ADDY: 0x7fff741731c0 ADDY: 0x7fff741731c0 pADDY: 0x7fff741731b8 pADDY: 0x7fff741731b8 fugitivus@fugitivus:~/workspace$vlt liegt es ja auch an der fehlenden time.c (keine ahnung) ?!?
Mfg Benny
-
McMorf schrieb:
camper schrieb:
wieso nicht einfach vprintf?
int vprintf ( const char * format, va_list arg );
ich find irgendwie das währe leicht verwirrend oder ?!?
also du meinst doch einfach die vorbelegten funktions parameter oder ?!?
Ich meine
int _printf(unsigned char _fgColor, unsigned char _bgColor, const char *strIn, ...) { bgColor(_bgColor); fgColor(_fgColor); va_list params; va_start(params,strIn); int result = vprintf(strIn, params); va_end(params); bgColor(normal); fgColor(normal); return result; }
-
camper schrieb:
McMorf schrieb:
camper schrieb:
wieso nicht einfach vprintf?
int vprintf ( const char * format, va_list arg );
ich find irgendwie das währe leicht verwirrend oder ?!?
also du meinst doch einfach die vorbelegten funktions parameter oder ?!?
Ich meine
int _printf(unsigned char _fgColor, unsigned char _bgColor, const char *strIn, ...) { bgColor(_bgColor); fgColor(_fgColor); va_list params; va_start(params,strIn); int result = vprintf(strIn, params); va_end(params); bgColor(normal); fgColor(normal); return result; }*haaaaaaaaare außreiß*
also eleganter geht nimmer, wenn man eh kein std::cout verwenden wollte
mein gott... naja immerhin, ist es nicht an der logik gescheitert 
Super Herzlichen Dank für all eure Bemühungen !!!!
-
mist...
geht nicht, wenn ich jetzt ein '\n' im format string habe, tritt mein problem ja wieder auf, es einfach raus schneiden geht nicht, weil dann ja wieder funktionalität verloren geht...mfg benny
-
Beschreib doch einfach mal dein Problem.
-
zu meinem problem :
http://www.c-plusplus.net/forum/312345noch ein neuer ansatz:
int _printf(unsigned char _fgColor, unsigned char _bgColor, const char *strIn, ...) { bgColor(_bgColor); fgColor(_fgColor); va_list params; va_start(params,strIn); int result = vprintf(strIn, params); va_end(params); bgColor(normal); fgColor(normal); return result; }vlt einfach den formatstring auf '\n' untersuchen, an der stelle abschneiden, nur den teil vor dem '\n' an vprintf() übergeben(mit kompletter parameter liste) ,dann farbe zurück setzen, dann '\n' an std übergeben,und dann beim nächsten teilstring weiter machen, solange bis kein '\n' mehr zu finden ist..... ich kann doch eigendlich die ganze parameter liste jedes mal mit übergeben oder ?!? <-- mist ich hab immer noch nicht nach den rückgabe werten von printf o. vprintf geguckt...
uff was nen kauderwälsch, ich hoffe ihr versteht mich

Mfg Benny
-
Versuche es mal mit vsprintf.
Die Ausgabe ist in einem string und dann gibst du die zwei teile mit puts() oder printf aus.
-
Ich nehme an die Funktionen
bgColor()undfgColor()werden auch nur diverse Steuercodes ausgeben...?
Falls das der Fall ist, kannst du ja alle\nim Format-String ersetzen mit einem String der erst die original Farbe setzt, dann das\nund dann wieder die gewünschte Farbe setzt.Also quasi aus "
Trallala: %d\nBlub: %d" würde dann "Trallala: %d{set-bg-color-sequence}{set-fg-color-sequence}\n{set-bg-color-sequence}{set-fg-color-sequence}Blub: %d".Da sich dadurch nichts an der Reihenfolge und Art der Formatierungszeichen ändert, kannst du den so modifizierten String dann 1:1 an
vprintfübergeben.Was dein Vorhaben mit dem Zerstückeln des Format-Strings angeht... nein, das geht nicht so einfach.
printf/vprintfkann ja z.B. beim 2. Teilstück nicht wissen wie viele/welche Formatierungszeichen im ersten Teilstück enthalten waren.
-
Nathan schrieb:
Versuche es mal mit vsprintf.
Die Ausgabe ist in einem string und dann gibst du die zwei teile mit puts() oder printf aus.nimm lieber http://linux.die.net/man/3/vasprintf, da hast du nicht das Problem mit dem Bufferoverflow
-
dd++ schrieb:
nimm lieber http://linux.die.net/man/3/vasprintf, da hast du nicht das Problem mit dem Bufferoverflow
<a href= schrieb:
man: vasprintf(3)">These functions are GNU extensions, not in C or POSIX. They are also available under *BSD. The FreeBSD implementation sets strp to NULL on error.
-
McMorf arbeitet mit g++
-
hustbaer schrieb:
Ich nehme an die Funktionen
bgColor()undfgColor()werden auch nur diverse Steuercodes ausgeben...?
Falls das der Fall ist, kannst du ja alle\nim Format-String ersetzen mit einem String der erst die original Farbe setzt, dann das\nund dann wieder die gewünschte Farbe setzt.Also quasi aus "
Trallala: %d\nBlub: %d" würde dann "Trallala: %d{set-bg-color-sequence}{set-fg-color-sequence}\n{set-bg-color-sequence}{set-fg-color-sequence}Blub: %d".Da sich dadurch nichts an der Reihenfolge und Art der Formatierungszeichen ändert, kannst du den so modifizierten String dann 1:1 an
vprintfübergeben.Was dein Vorhaben mit dem Zerstückeln des Format-Strings angeht... nein, das geht nicht so einfach.
printf/vprintfkann ja z.B. beim 2. Teilstück nicht wissen wie viele/welche Formatierungszeichen im ersten Teilstück enthalten waren.Ja, manchmal sieht man den wald vor lauter bäumen nicht

aber darauf währ ich gez nie gekommen, wobei das ja der einfachste ansatz ist
-
habs dann mal weiter ausgearbeitet, schon viel schöner das ganze....
ok, das mit den compiler anweisungen muss ich mir dann mal angucken, aber immo benutz ich ja nur gcc/g++....hier mal der code:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> #include <stdarg.h> #include <iostream> #ifdef WIN32 #define WINDOWS #elif WIN64 #define WINDOWS #elif _WIN32 #define WINDOWS #elif linux #define LINUX #elif _linux_ #define LINUX #elif __APPLE__ #define MAC #endif //Farb Konstanten Linux/Unix/BSD für terminals die "ansi escape sequenzen" unterstützen #define normal 0x00 #define black 0x1E #define red 0x1F #define green 0x20 #define yellow 0x21 #define blue 0x22 #define magenta 0x23 #define cyan 0x24 #define white 0x25 //nicht schön aber selten :P int bgColor(unsigned char _bgColor) { #ifdef WINDOWS hwnd=GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo(hwnd, &csbi ); return SetConsoleTextAttribute(hwnd,((csbi.wAttributes & 0xFF0F) | (_bgColor << 4))); #endif #ifdef LINUX if(_bgColor!=0) { return printf("\033[%im",(_bgColor+10)); }else { return printf("\033[%im",0); } #endif #ifdef MAC #warning console.text.bgColor() not implemented for Mac yet return 0; #endif } //nicht schön aber selten :P int fgColor(unsigned char _fgColor) { #ifdef WINDOWS hwnd=GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo( hwnd, &csbi ); return SetConsoleTextAttribute(hwnd,(csbi.wAttributes & 0xFFF0) | _fgColor); #endif #ifdef LINUX return printf("\033[%im",_fgColor); #endif #ifdef MAC #warning console.text.fgColor() not implemented for Mac yet return 0; #endif } int mkForeColor(char *colorString ,unsigned char color) { char buffer[10]={}; char *ptrBuffer=&buffer[0]; sprintf(buffer,"\033[%im",color); while(*ptrBuffer!=0)*colorString++=*ptrBuffer++; return strlen(buffer); } int mkBackColor(char *colorString ,unsigned char color) { char buffer[10]={}; char *ptrBuffer=&buffer[0]; sprintf(buffer,"\033[%im",(color+10)); while(*ptrBuffer!=0)*colorString++=*ptrBuffer++; return strlen(buffer); } int _printf(unsigned char _fgColor, unsigned char _bgColor, const char *format, ...) { char color[10]={}; char buffer[4096]={}; char *ptrBuff=&buffer[0]; char *ptrColor=&color[0]; #ifdef LINUX while(*format!=0) { if(*format!='\n') { *ptrBuff++=*format++; }else { mkBackColor(color,normal); while(*ptrColor!=0)*ptrBuff++=*ptrColor++; *ptrBuff++='\n'; ptrColor=&color[0]; mkBackColor(color,_bgColor); while(*ptrColor!=0)*ptrBuff++=*ptrColor++; ptrColor=&color[0]; format++; } } #endif bgColor(_bgColor); fgColor(_fgColor); va_list params; va_start(params,format); int result = vprintf(buffer, params); va_end(params); bgColor(normal); fgColor(normal); return result; } int main(int argc, char* argv[]) { char chr=123; int integer=123; unsigned int uint=123; short int sinteger=123; long int linteger=123; double dbl=123.321; long double ldbl=123.321; char *cchar=(char*)"HalloWelt!"; char *addy=cchar; void *paddy=&cchar; _printf(cyan,normal,"Variablen:\n"); printf("%s\n",cchar); _printf(red,normal,"%s\n",cchar); printf("CHAR %c\n",'#'); _printf(red,normal,"CHAR %c\n",'#'); printf("INT %i\n",integer); _printf(red,normal,"INT %i\n",integer); printf("uINT %u > %o > %x > %X\n",uint,uint,uint,uint); _printf(red,normal,"uINT %u > %o > %x > %X\n",uint,uint,uint,uint); printf("LONG DBL %LG > %Lf > %LE \n",ldbl,ldbl,ldbl); _printf(red,normal,"LONG DBL %LG > %Lf > %LE \n",ldbl,ldbl,ldbl); printf("DBL %.3f > %E > %.2e\n",dbl,dbl,dbl); _printf(red,normal,"DBL %.3f > %E > %.2e\n",dbl,dbl,dbl); printf("sINT %hi\n",sinteger); _printf(red,normal,"sINT %hi\n",sinteger); printf("lINT %li\n",linteger); _printf(red,normal,"lINT %hi\n",linteger); _printf(cyan,normal,"Speicher Addressen:\n"); printf("ADDY: %p\n",&addy); _printf(red,normal,"ADDY: %p\n",&addy); printf("pADDY: %p\n",paddy); _printf(red,normal,"pADDY: %p\n",paddy); return 0; }Herzlichen dank für die ganzen rückmeldungen !
Ihr habt mir sehr geholfen !
Mfg Benny
-
// ... int main() { char* fmt = malloc(64*1024); memser(fmt, "A", 64*1024); fmt[1024*1024 - 5] = 'a'; fmt[1024*1024 - 4] = 'h'; fmt[1024*1024 - 3] = '!'; fmt[1024*1024 - 2] = '\n'; fmt[1024*1024 - 1] = 0; _printf(black, red, fmt); return 0; }