UINT in String oder so casten



  • Ich habe mir von Visual C++ 6.0 ein HelloWorld-Programm kreieren lassen und nur diese Funktion geändert:

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	//[...] unverändert...
    	char* text="s";
    	switch( message ) 
    	{
    
    //[...]
    		case WM_PAINT:
    			hdc = BeginPaint (hWnd, &ps);
    			_itoa(67, text, 10);
    			RECT rt;
    			GetClientRect( hWnd, &rt );
    			DrawText( hdc, text, strlen(text), &rt, DT_CENTER );
    			EndPaint( hWnd, &ps );
    			break;
    		case WM_DESTROY:
    			PostQuitMessage( 0 );
    			break;
    		default:
    			return DefWindowProc( hWnd, message, wParam, lParam );
       }
       return 0;
    }
    

    so, ich hoffe das reicht, mehr hab ich nicht gemacht, ehrlich...



  • Du musst einen Buffer bereistellen, der genügend Platz hat um die Zahl als String aufzunehmen...
    Du stellst aber weder einen gültigen Buffer bereit noch genügend Platz...

    Und ganz abgesehen davon ist das _itoa für einen "int" und keine "uint"... aber mein Vorschlag hast Du ja schon vielleicht gelesen...



  • genau, dann misch ich mich gleich auch nochmal ein, nachdem ich vorher mist verzapft habe 😃

    Jochens war eh der bessere bzw richtige Vorschlag, da zB bei _itoa(4 000 000 000) eine negative Zahl in den String liefern, da die 4 Mio > 2^31 und _itoa() die Zahl aber als SIGNED INT und das gesetzte erste Bit deshalb als "Minus-Bit" interpretieren wuerde.
    genau das umgeht Jochens Beispiel.

    gruss



  • Jochen Kalmbach schrieb:

    TCHAR szStr[100];
    UINT uVal = 0;
    _sntprintf(szStr, , sizeof(szStr)-1,  "%u", uVal);
    

    So aber nicht.
    So schon eher:

    TCHAR s[100];
    UINT x = 0;
    _sntprintf(s, sizeof(s) / sizeof(*s),  _T("%u"), x);
    


  • groovemaster schrieb:

    TCHAR s[100];
    UINT x = 0;
    _sntprintf(s, sizeof(s) / sizeof(*s),  _T("%u"), x);
    

    Ne... so auch nicht... die ganz, ganz richtige Lösung ist:

    TCHAR szStr[100]; 
      UINT uVal = 0; 
      _sntprintf(szStr, sizeof(szStr)-1,  _T("%u"), uVal);
      szStr[sizeof(szStr)-1] = 0;
    


  • ^^ oder du bleibst mit deinen werten einfach unter 2 Milliarden und bei _itoa() 😉



  • Dann hast Du aber mit VC2005 das Problem, dass die Funktion deprecated ist, da sie unsicher ist...



  • Jochen Kalmbach schrieb:

    groovemaster schrieb:

    TCHAR s[100];
    UINT x = 0;
    _sntprintf(s, sizeof(s) / sizeof(*s),  _T("%u"), x);
    

    Ne... so auch nicht...

    Doch, genau so. 😉
    Wenn du Fehler abfangen willst, dann überprüfe den Rückgabewert.

    btw:
    sizeof liefert immer noch Bytes und nicht Zeichen.

    szStr[sizeof(szStr)-1] = 0;
    

    erzeugt bereits undefiniertes Verhalten.



  • Da muss ich DIr doch glatt Recht geben... hab ich irgendwie übersehen... sorry!



  • Leute! Hilfe! Jochens erste Lösung geht doch, was soll ich mit noch einer? und noch einer? und noch einer? also: Problem gelöst, aber wenn ihr gerne weiterdisskutieren wollt, bitte...aber ich brauche es nicht mehr und lese es nicht mehr :p



  • Nimm bitte die Lösung:

    TCHAR s[100]; 
    UINT x = 0; 
    _sntprintf(s, sizeof(s) / sizeof(TCHAR),  _T("%u"), x);
    s[(sizeof(s)/sizeof(TCHAR))-1] = 0;
    

    Meine erste Funktionier nur, wenn Du kein UNICODE verwendest...


Anmelden zum Antworten