swprintf



  • wie ist swprintf unter windows implementiert? muesste in der wchar.h sein...da steht nur die funktionsdeklaration!...hm



  • Suchst Du nach einer Definition der Funktion ?

    Alle Funktionen der WinAPI bzw. der CRT sind nur in Form von Prototypen vorhanden (deklariert in den entsprechenden Headern). Du lädst die Definitionen eigentlich entweder dynmaisch über die System-DLL's oder (Standard) über die STD-Libraries, also statisch. Der Quellcode ist nicht OpenSource, wenn Du Dich auf die MS-Compiler beziehst.

    Hier gibts ne Definition von sprintf 😉 , wenn Dir das weiter hilft.

    EDIT: Grad noch das gefunden: http://www.reactos.org/generated/doxygen/de/da0/rtl_2swprintf_8c-source.html


  • Mod

    Aber der Quellcode von wsprintf ist im CRT Sourcecode zu sehen.



  • swprintf ruft intern: _vswprintf auf
    was ist da der unterschied zu vswprintf?

    cu


  • Mod

    Bei mir nicht, bei mir wird _vswprintf_l aufgerufen (VS2005)
    Ich vermute mal, dass es sich hier einfach um die interne Implementierung handelt deshalb auch der Underscore am Anfang der Funktion.



  • Martin Richter schrieb:

    Aber der Quellcode von wsprintf ist im CRT Sourcecode zu sehen.

    Nein ist er nicht. Der Quellcode von swprintf ist vorhanden, obwohl der einem rein gar nichts bringt, da dort prinzipiell nur eine andere Funktion (namens "_vswprintf_c_l") aufgerufen wird -also nicht sehr informativ-. Die Definition von "_vswprintf_c_l" ist nämlich wiederum nicht vorhanden.

    PS: IDE/Compiler ist (auch) VS 2005 (Express Ed.).


  • Mod

    Warum musst Du gleich laut werden.
    Trace doch durch den Code durch. Der gesamte Code ist vorhanden! :xmas1: :xmas1:
    Sie ist im Sourcecode der CRT komplett enthalten.
    Siehe vswprint.c. Diese Funktionen dort rufen indirekt _output auf. Diese Funktion (der eigentliche Code von allen printf Funktionen) findet sich in output.c!

    Ich nutze VS2005 hier, in der VS2003 ist der Code auch, wenn auch etwas anders. Die Dateinamen sind gleich.



  • BEI DER EXPRESS EDITION IST DER QUELLCODE DER CRT IMHO GAR NICHT DABEI.



  • Martin Richter schrieb:

    Warum musst Du gleich laut werden.
    Trace doch durch den Code durch. Der gesamte Code ist vorhanden! :xmas1: :xmas1:
    Sie ist im Sourcecode der CRT komplett enthalten.
    Siehe vswprint.c. Diese Funktionen dort rufen indirekt _output auf. Diese Funktion (der eigentliche Code von allen printf Funktionen) findet sich in output.c!

    Ich nutze VS2005 hier, in der VS2003 ist der Code auch, wenn auch etwas anders. Die Dateinamen sind gleich.

    Sorry sollte nicht laut aussehen 😃 ... 😉 . Wollte damit nur deutlich machen, dass es mir um das 'ist nicht dabei' ging ^^.
    Hm hab den Code nit gefunden, aber ist eigentlich auch Rille... :xmas1:



  • es gibt 2 versionen:

    int vswprintf(
       wchar_t *buffer,
       const wchar_t *format,
       va_list argptr 
    );
    int vswprintf(
       wchar_t *buffer,
       size_t count,
       const wchar_t *format,
       va_list argptr 
    ); //  (C++ only)
    

    was bringt das size_t count?



  • cpp1 schrieb:

    was bringt das size_t count?

    Das steht in der MSDN Library, unter "vswprintf function".


  • Mod

    Er soll verhindern, dass ein größrer Speicherbereich benutzt wird, als Du angelegt hast.



  • Martin Richter schrieb:

    Er soll verhindern, dass ein größrer Speicherbereich benutzt wird, als Du angelegt hast.

    aber das kann ich ja ueber den return param pruefen?

    int vswprintf(
    wchar_t (&buffer)[size],
    size_t count,
    const wchar_t *format,
    va_list argptr
    ); // C++ only

    ...ist C++ only das der unterschied...



  • swprintf ruft bei mir count _vswprintf_c_l auf...dafuer gibt es keine doku?
    ohne count wird _vswprintf aufgerufen...

    cu



  • swprintf ruft bei mir mit dem param count _vswprintf_c_l auf...


  • Mod

    cpp1 schrieb:

    Martin Richter schrieb:

    Er soll verhindern, dass ein größrer Speicherbereich benutzt wird, als Du angelegt hast.

    aber das kann ich ja ueber den return param pruefen?

    int vswprintf(
    wchar_t (&buffer)[size],
    size_t count,
    const wchar_t *format,
    va_list argptr
    ); // C++ only

    ...ist C++ only das der unterschied...

    Nein das kanst Du nicht! Wenn Du einen puffer mit 2 Bytes angibst und dort hinein 100 Bytes schreiben lässt, dann wird der Speicherbereich hinter Deinen 2 bytes überschrieben!



  • // main.c
    #include <assert.h>
    #include <ctype.h>
    #include <errno.h>
    #include <float.h>
    #include <iso646.h>
    #include <limits.h>
    #include <locale.h>
    #include <math.h>
    #include <setjmp.h>
    #include <signal.h>
    #include <stdarg.h>
    #include <stddef.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    #include <wchar.h>
    #include <wctype.h>
    
    //#define _CRT_NON_CONFORMING_SWPRINTFS
    
    int main()
    {
    	wchar_t s[80];
    	int ret = 0;
    
    	swprintf(s, L"SHUTDOWN" );
    
    	return 0;
    }
    

    main.c(27) : error C2198: 'swprintf' : too few arguments for call

    warum bekomme ich diesen error? bekomme ich nur wenn ich den c compiler nehme...mit c++ compiler gehts ohne error...


Anmelden zum Antworten