swprintf ? falsche interpretation der Parameter ?



  • Hallo

    Ich verwende die Funktion "swprintf".
    Ich habe folgendes Problem Studio zeigt mir 2 Siganturen an.
    einmal mit: einem "count" und einmal ohne.

    int swprintf(
    wchar_t *buffer,
    size_t count,
    const wchar_t *format [,
    argument]...);

    Ich verwende die Variante ohne Count. Nach eine Konvertierung von VC6 auf VC2008 benutzt er aber die variante
    mit dem count. Von mir aus ok ich kann es ja umändern meine Frag ist aber:
    Der Compiler warnt mich nicht sonder bei Aufruf von:

    wchar_t *txt = NULL;
    wchar_t *fmt = NULL;

    // txt wird irgendwann zugewiesen.
    fmt = _C("Text %d");

    swprintf( txt, fmt, 100);

    wird fäschlicherweise fmt als "count" interpretiert. Wie kann das passieren ? Sollte doch von einem Anderem Typ sein. ??
    Hat jemand eine Tipp ? Oder kann das erklähren ?

    Gruß
    Martin



  • Das musst Du mir nochmals erklären...
    http://msdn.microsoft.com/en-us/library/ybk95axf.aspx

    Wo soll es da als dritten Parameter einen Count geben?
    Und was soll ein _C in Deinem Code?



  • Hallo

    Wann hab ich gesagt dass als 3 Parameter ein count ist ? 🙂

    Also noch mal das Beispiel:

    swprintf( txt, "Zahl: %d" , 100);

    Der compiler interpretiert jetzt ohn mich zu warnene "Zahl: %d" als die Größe für count.
    Wie kann das passieren ?
    Zur laufziet stürtzt das Programm natürlich ab und beim debbugen sehe ich dass er in der Funktion mit der Sigantur mit Count ist. ...

    Grüße
    Martin



  • Es gibt eine Überladung der Funktion, in der kein 'count' vorkommt. Dann ist der 2. Parameter vom Typ wchar_t* und dein als drittes übergebener Parameter gehört zur Endlos-Parameter-Liste ("...").

    Wenn man ein wenig in den grausigen MS-Headern sucht, findet man u.a. folgende Funktion:

    extern "C++" _SWPRINTFS_DEPRECATED _CRT_INSECURE_DEPRECATE(swprintf_s) __inline int swprintf(_Pre_notnull_ _Post_z_ wchar_t * _String, _In_z_ _Printf_format_string_ const wchar_t * _Format, ...)
    


  • Hallo

    Aber genau darum geht es mir ja.
    Das ist mein Frage! Normalerweise gibt es 2 Überladungen. Der Compiler sucht die passende von der Signatur her aus. Ich aber habe das Problem das er die Falsche Signatur wählt und bei swprintf( txt, "Zahl: %d" , 100); eben den 2ter Parameter als count interpretiert. Wie kann das passieren ? Es ist doch ein anderer Typ.

    Jedenfalls sehe ich im Debugger das er in der Funktion mit dem Count ist und in Count natürlich murx steht.
    Dadurch kommt alles durcheinader und zur laufzeit stürtz mein Programm ab. Weil "100" Ja nicht das Format ist.

    Erweiter ich die funktion mit
    swprintf( txt, 50, "Zahl: %d" , 100); (weil ich die fröße von "text" kenne) passt alles und es funktioniert.

    Mein Frage ist aber wie das passieren kann ? Weil wenn ich ein mini Projekt mache in dem ich das nachbaue ... funktioniert alles richtig.???

    Jetzt klar was meine Frage ist ?

    grüße
    Martin



  • Ok sorry, hatte irgendwie nur die Hälfte wirklich richtig gelesen... 🤡

    Also wenn es wirklich so ist, wie du sagst, ist das allerdings sehr komisch. Wie kann er das kompilieren? Machst du da vielleicht irgendeinen Murks (sowas wie Windows-Header einbinden, die man nicht selbst einbinden darf, oder gar darin rumpfuschen)?



  • Nein natürlich mache ich das nicht 🙂
    Sage ich weil es mir noch nicht bewusst ist ...

    Aber noch mal von oben schon mal erwähnt habe ich das Projekt von VC6 auf VC2008 konervtiert.

    Ich kann auch laut MSDN http://msdn.microsoft.com/en-us/library/ybk95axf.aspx
    mit #define _CRT_NON_CONFORMING_SWPRINTFS in dazu zwingen die "alten zu nutzen:

    In Visual C++ 2005, swprintf conforms to the ISO C Standard, which requires the second parameter, count, of type size_t. To force the old nonstandard behavior, define _CRT_NON_CONFORMING_SWPRINTFS. In a future version, the old behavior may be removed, so code should be changed to use the new conformant behavior.

    Welche Windows headerdatein meinst du denn ? die ich nicht einbinden dürfte.
    Zumindest mache ich es nicht bewusst 😉 ...


Anmelden zum Antworten