eigenes pseudo printf() fehler bei long double und algemeine fragen dazu



  • 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 ?!?



  • SeppJ schrieb:

    McMorf schrieb:

    ich weis ja nicht welchen compiler du verwendest... die compieler direktieven sind glaub ich gcc speziefisch... 🙂

    GCC (wie du siehst, sind deine Makros wohl falsch), aber die Fehler gelten in jedem anderen nicht-unterstüzten Compiler auch. Du musst aufpassen, dass in deinen define-Orgien einen sinnvollen default-Fall oder wenigstens einen Fehler produzieren, wenn nichts passt.

    da hast du scheinbar nicht unrecht 🙂
    werd in zukunft besser drauf achten, hab aber jetzt mal nicht mit sowas gerechnet 🙂



  • 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


  • Mod

    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


  • Mod

    Beschreib doch einfach mal dein Problem.



  • zu meinem problem :
    http://www.c-plusplus.net/forum/312345

    noch 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() und fgColor() werden auch nur diverse Steuercodes ausgeben...?
    Falls das der Fall ist, kannst du ja alle \n im Format-String ersetzen mit einem String der erst die original Farbe setzt, dann das \n und 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/vprintf kann 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() und fgColor() werden auch nur diverse Steuercodes ausgeben...?
    Falls das der Fall ist, kannst du ja alle \n im Format-String ersetzen mit einem String der erst die original Farbe setzt, dann das \n und 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/vprintf kann 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;
    }
    

Anmelden zum Antworten