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.
-
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 helfenhier
:xmas1: :xmas2: