TCHAR in char*



  • Hallo

    Ich teste gerade mal Visual Studio 2005 und bekomme einige Fehlermeldungen, die ich mit 2003 nicht hatte:

    void CLogfile::fTextOut(int p_iColor, const char* p_pchText,...)
    {
    	TCHAR buffer[MAX_BUFFER];
    	va_list pArgList;
    
    	va_start(pArgList, p_pchText);
    	vsprintf(buffer, p_pchText, pArgList);
    	va_end(pArgList);
    
    	TextOut(p_iColor,buffer);
    }
    

    Fehlermeldung:

    : error C2664: 'vsprintf' : cannot convert parameter 1 from 'TCHAR [1024]' to 'char *'

    Das hatte ich, wie oben bereits erwähnt, mit der 2003er Version nicht. Was kann ich dagegen tun und warum ist dies jetzt eine Fehlermeldung wert und fruher war es kein Problem?

    chrische



  • Weil beim 2005er standardmäßig mit Unicode gearbeitet wird und TCHAR dann nunmal kein char ist sondern wchar_t.

    Gute Möglichkeit a): Du stellst dein Projekt auf Unicode um, machst aus "const char*" ein "const TCHAR*", includierst die <tchar.h> und schreibst vor jeden String ein TEXT("Mein String") bzw. wenn du nur dir sicher bist nur noch für Unicode compilieren zu wollen reicht auch ein: L"MeinStr"

    Schlechte Möglichkeit b): Du verzichtest weiterhin auf die Lösung aller Codepage-Probleme und stellst in den Projekteinstellungen wieder auf MBCS um.

    MfG SideWinder



  • Hallo

    Danke für deine sehr schnelle Hilfe. Ich werde nun baer wirklich ins Bett gehen und morgen weiter am alten Programm schrauben.

    chrische



  • Hallo

    Ich habe jetzt mal ein paar Sachen verändert und konnte die Fehlermeldung nun etwas eingrenzen. Jetzt bin ich mit meinem Latein erst mal Ende.

    Quellcode:

    void CLogfile::TextOut(const TCHAR* p_pchText)
    {
    	fprintf(m_pLogfile, p_pchText);
    	fflush(m_pLogfile);
    }
    

    die dazugehörige Fehlermeldung:

    error C2664: 'fprintf' : cannot convert parameter 2 from 'const TCHAR *' to 'const char *'

    In dieser Art habe ich mehere Meldungen. Dazu kommt, dass ich Warnungen bekomme, die ich nicht verstehe, weil cih Sie vorher nicht hatte:

    void CLogfile::CreateLogfile()
    {
    	//Logfile leeren und Kopf schreiben
    	m_pLogfile = fopen("Logfile.html", "w");
    	TextOut("<html><head><title>Logfile</title></head>");
    	TextOut("<body><font face='book antiqua'>");
    	WriteTopic("Logfile",5);
    

    Warnung:

    warning C4996: 'fopen' was declared deprecated

    Er bietet mir an, dass ich fopen_s nehmen sool, aber dann meckert er, dass diese Funktion keine zwei Parameter nimmt.

    Vielen Dank für eure Hilfe

    chrische



  • #include <tchar.h>

    _tfprintf



  • all methods taking a zero-terminated string are deprecated and for
    those that don't have a version taking a size_t, a new method ending in _s
    (fopen_s) was added, taking an extra size_t for the size of the string.


  • Mod

    chrische5 schrieb:

    warning C4996: 'fopen' was declared deprecated

    du kannst

    #define _CRT_SECURE_NO_DEPRECATE 1
    

    benutzen (d.h. ddieses symbol definieren, bevor du irgendwelche system-header einbindest), um diese warnung loszuwerden. obwohl die zugrundeliegende idee gar nicht so schlecht ist, ist der wert solcher proprietärer erweiterungen doch zweifelhaft (im übrigen kann man auch mit den 'sicheren' funktionen eine ganze menge unsinn anstellen.



  • @chrische5
    Schau dir mal <tchar.h> etwas genauer an, dort gibt es für viele Funktionen, die ein char* erwarten, ein passendes TCHAR* Gegenstück. Für Stringliterale kannst du _T verwenden.
    Und auf die _s Funktionen würde ich persönlich nicht zurückgreifen. Erstens sind sie nicht wirklich sicher, vielleicht sicherer, aber sicher nicht sicher. 🙂 Und zweitens wird man dann mit anderen Compilern bzw. andren stdlib Implementierungen richtig Probleme bekommen. Da würde ich lieber auf das Makro von camper zurückgreifen.



  • Hallo

    Erstmal danke für eure Hilfe. Ich weiss ehrlich geasgt gar nicht, was hier eigentlich das Problem ist. Mit 2003 ging alles super und nun dieser Stress, aber daran kann man ja nur wachsen. Ich weiss gar nicht, an was ich alles noch denken muss. Gib es eine Funktion für std::strings die analog zur Methode c_str() einen solchen String in ein TCHAR* umwandelt?

    chrische



  • Du kannst auch einfach in den Projektoptionen Unicode abschalten und gut is.



  • Nimm std::wstring wenn du eine wchar_t* brauchst.

    Gruß



  • Hallo

    Sorry, dass ich mich hier von Problem zu Problem hangele, aber das ist hier absolutes Neuland für mich. Nun stolpere ich über folgende Fehler:

    Code:

    std::wstring strErrorCode = SDL_GetError();
    

    Fehlermeldung:

    error C2440: 'static_cast' : cannot convert from 'char *' to 'std::wstring'

    Mir ist auch klar, was er will, aber nicht was ich machen kann.

    Ich hoffe, dass das heute nicht den ganzen Tag so weiter geht.

    chrische



  • Die Umstellerei wird nix bringen bei einem Spiel.



  • Hallo

    ............. schrieb:

    Die Umstellerei wird nix bringen bei einem Spiel.

    Was soll das den heißen? Ich würde gerne weiter mit der Klasse arbeiten, in der dieser Zeile steht. Das muss es doch eine Möglichkeit geben auch Fehlermeldung von SDL zu bearbeiten, wenn man std::wstring benutzt.

    chrische



  • Stell doch einfach Unicode aus wenn du es nicht brauchst...

    Gruß



  • Hallo

    FireFlow schrieb:

    Stell doch einfach Unicode aus wenn du es nicht brauchst...

    Gruß

    Dazu folgender Beitrag:

    SideWinder schrieb:

    Weil beim 2005er standardmäßig mit Unicode gearbeitet wird und TCHAR dann nunmal kein char ist sondern wchar_t.

    Gute Möglichkeit a): Du stellst dein Projekt auf Unicode um, machst aus "const char*" ein "const TCHAR*", includierst die <tchar.h> und schreibst vor jeden String ein TEXT("Mein String") bzw. wenn du nur dir sicher bist nur noch für Unicode compilieren zu wollen reicht auch ein: L"MeinStr"

    Schlechte Möglichkeit b): Du verzichtest weiterhin auf die Lösung aller Codepage-Probleme und stellst in den Projekteinstellungen wieder auf MBCS um.

    MfG SideWinder

    Es muss doch ausserdem auch mit UNICODE klappen. Ich habe nur leider keine Ahnung, wie man char* zu std::wstring konvertieren kann.

    chrische



  • chrische5 schrieb:

    Nun stolpere ich über folgende Fehler:

    Code:

    std::wstring strErrorCode = SDL_GetError();
    

    Fehlermeldung:

    error C2440: 'static_cast' : cannot convert from 'char *' to 'std::wstring'

    Mir ist auch klar, was er will, aber nicht was ich machen kann.

    Gibt es ein SDL_GetError, was wchar_t* zurückliefert?
    Ansonsten musst du den String entsprechend umwandeln. Und manchmal kann einem die FAQ Sektion dabei helfen ➡ hier 😉
    :xmas1: :xmas2:


Anmelden zum Antworten