VS streikt
-
Hallo Leute,
hab ein Problem mit einer Suchfunktion in meinem Programm. Der Witz ist, dass mit dem Borland Builder alles wunderbar, ohne Warnungen durchläuft, mit VS 2005 Prof. aber folgende Fehlermeldung erscheint:
Compiling... 1>test.cpp 1>.\test.cpp(65) : error C2664: 'sprintf' : cannot convert parameter 1 from 'TCHAR [1000]' to 'char *' 1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style castHier mal die Funktion in voller Ausführlichkeit:
dirsearch("c:\\", "*.txt*");void dirsearch(const string& path, const string& filter) { HANDLE hFindFile; WIN32_FIND_DATA wfd; TCHAR buf[1000]; sprintf(buf, "%s\\%s", path, filter); //hier liegt anscheinend das Problem hFindFile = FindFirstFile(buf, &wfd); if (hFindFile != INVALID_HANDLE_VALUE) { do { if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) cout << path <<"\\"<< wfd.cFileName << endl; }while(FindNextFile(hFindFile, &wfd) != 0); FindClose(hFindFile); } }Ich vermute, dass es was mit Unicode/Ansi zu tun hat und habe deswegen in den Projekteinstellungen mal ein bisschen rumgedoktert (Unicode auf Multibyte usw.) leider ohne Ergebnis

Ich hoffe ihr könnt mir vielleicht irgendwie weiterhelfen.
-
sprintf kommt nicht mit TCHAR zurecht, nimm lieber das hier
TCHAR buf[1000]; SecureZeroMemory(buf, 1000); _stprintf_s(buf, _T("%s\\%s"), path, filter);wobei ich aber nicht umbedingt es so machen wuerde, da du ja beides aps string bekommst:
std::string buf; buf = path + _T("\\") + filter; TCHAR *strBuff = new TCHAR[(buf.length())+(sizeof(TCHAR))]; _tcscpy_s(strBuff, buf); // do something with the strBuff delete [] strBuff; strBuff = 0;btw, mach es lieber unicode und multibyte compatibel, dh wenn du schon mit TCHAR arbeitest solltest du ein string oder wstring definieren, ich selber habe da
std::tstring
-
Vielen Dank Evil, jetzt läufts durch(Compiler und Linker).
Allerdings haut mir jetzt der Just-In-Time Debugger noch dazwischen und meldet eine "Unhandled Win32 Exception" bei der Programmausführung und bricht es ab.
Vielleicht hatte schon mal jemand ein ähnliches Problem und kann mir auch damit helfen.
-
kannst du im debug rein springen wo der fehler angezeigt wurde ?
kannst du auch gleich mal bitte zeigen wie das code nun aussieht, also die funktion
-
path und filter sind ja auch std::strings...
-
void dirsearch(const string& path, const string& filter) { HANDLE hFindFile; WIN32_FIND_DATA wfd; string buf; buf = path + "\\" + filter; //So? hFindFile = FindFirstFile(buf.c_str(), &wfd); if (hFindFile != INVALID_HANDLE_VALUE) { do { if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) cout << path <<"\\"<< wfd.cFileName << endl; }while(FindNextFile(hFindFile, &wfd) != 0); FindClose(hFindFile); } }
-
Hier der Code:
void dirsearch(const string& path, const string& filter) { HANDLE hFindFile; WIN32_FIND_DATA wfd; TCHAR buf[1000]; SecureZeroMemory(buf, 1000); _stprintf_s(buf, _T("%s\\%s"), path, filter); //hier bleibt der Debugger hängenAn der oben gezeigten Stelle springt er in die output.c und hängt dann im folgenden Block:
else /* _UNICODE */ if (flags & (FL_LONG|FL_WIDECHAR)) { if (text.wz == NULL) /* NULL passed, use special string */ text.wz = __wnullstring; bufferiswide = 1; pwch = text.wz; while ( i-- && *pwch ) ++pwch; textlen = (int)(pwch - text.wz); /* textlen now contains length in wide chars */ } else { if (text.sz == NULL) /* NULL passed, use special string */ text.sz = __nullstring; p = text.sz; hier --> while (i-- && *p) ++p; textlen = (int)(p - text.sz); /* length of the string */ }Fehlermeldung:
Unhandled exception at 0x102293fe (msvcr80d.dll) in test.exe: 0xC0000005: Access violation reading location 0xcccccccc.
-
mach mal des
statt
_stprintf_s(buf, _T("%s\%s"), path, filter);dieses
_stprintf_s(buf, _T("%s\%s"), path.c_str(), filter.c_str());ich glaub das es mit den strings selber nicht geht
aber ich frag nochmal, warum so?
das ist besser
std::tstring strTemp; strTemp = path + _T("\\") + filter; TCHAR *strBuff = new TCHAR[(strTemp.length())+(sizeof(TCHAR))]; _tcscpy_s(strBuff, temp);
-
Danke für die Mühen und deine Geduld Evil. Es läuft jetzt!

Eine Sache noch kannst du mir den Vorteil von deinem Code gegenüber dem hier erklären?
Ich verlier nämlich langsam den Überblick und versuchs jetzt so leicht wie möglich zu schreiben.void dirsearch(const string& path, const string& filter) { HANDLE hFindFile; WIN32_FIND_DATA wfd; string buf; buf = path + "\\" + filter; cout << "Es wird gesucht nach: " << buf << endl; hFindFile = FindFirstFile(buf.c_str(), &wfd); if (hFindFile != INVALID_HANDLE_VALUE) { do { if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) cout << path <<"\\"<< wfd.cFileName << endl; }while(FindNextFile(hFindFile, &wfd) != 0); FindClose(hFindFile); } }
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Compiler- und IDE-Forum in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
da gibts nicht viel zu erklaeren, du hast es ja so benutzt wie ich wollte - mein zusatz mit den copy hatte ich nur da ich nicht wusste ob du mit den .c_str() direkt arbeiten kannst oder ein TCHAR brauchst
-
Mr Evil schrieb:
std::tstring strTemp; strTemp = path + _T("\\") + filter; TCHAR *strBuff = new TCHAR[(strTemp.length())+(sizeof(TCHAR))]; _tcscpy_s(strBuff, temp);Du mischt hier aber Zeichensatz unabhängigen Code (siehe TCHAR und _T-Makro) mit ANSI-Only-Code (siehe std::string). Entweder Du definierst einen entsprechenden Typ der sich dem aktuellen Zeichensatz anpasst oder Du instantiierst die Klasse std::basic_string für den Typ TCHAR neu.
Des weiteren ist das sizeof(TCHAR) hier -in der Form- überflüssig:
Mr Evil schrieb:
TCHAR *strBuff = new TCHAR[(strTemp.length())+(sizeof(TCHAR))];Es sollte heißen:
TCHAR* szBuffer = new TCHAR[strTemp.length() + 1];Beim Operator new gibt man nur die Anzahl der benötigten Zeichen an, nicht die benötigten Bytes
.
-
Mr Evil schrieb:
da gibts nicht viel zu erklaeren, du hast es ja so benutzt wie ich wollte - mein zusatz mit den copy hatte ich nur da ich nicht wusste ob du mit den .c_str() direkt arbeiten kannst oder ein TCHAR brauchst
Das sollte sich damit dann auch erklären
.
-
CodeFinder schrieb:
Mr Evil schrieb:
std::tstring strTemp; strTemp = path + _T("\\") + filter; TCHAR *strBuff = new TCHAR[(strTemp.length())+(sizeof(TCHAR))]; _tcscpy_s(strBuff, temp);Du mischt hier aber Zeichensatz unabhängigen Code (siehe TCHAR und _T-Makro) mit ANSI-Only-Code (siehe std::string). Entweder Du definierst einen entsprechenden Typ der sich dem aktuellen Zeichensatz anpasst oder Du instantiierst die Klasse std::basic_string für den Typ TCHAR neu.
ehm, lies mal meine deklaration genau, dann siehst du das dort "std::tstring" definiert, ist - also nichts ansi only sondern multibyte und unicode faehig {o; - ich ging auch davon aus das die variablen path und filter entsprechend deklariert werden #gg
das mit den new {+1} hab ich in meinen source auch immer, hatte das nur falsch in erinnerung hier im topic, es moege mir veriehen sein {o;