STRCPY problem
-
wo find ich die makros?
-
Unter Project -> Settings im Tab "C/C++", Feld "Preprocessor Definitions".
-
DEBUG,ARM,_ARM_,ARMV4I,UNDER_CE=(CEVersion),$(CePlatform),UNICODE,_UNICODE,_AFXDLL
sieht fast danach aus
-
Ja, da steht's doch - "...,UNICODE,_UNICODE,..." Das bedeutet, daß CString nicht mit "normalen" char-Daten arbeitet, sondern mit wchar_t-Daten (wide-character - die Zeichen sind etwas größer, um z.B. chinesische Schriftzeichen oder ähnliches unterbringen zu können). Wenn du die unbedingt mit Standard-Strings kombinieren willst, brauchst du auch die wchar_t-Variante davon - std::wstring.
Aber für dich dürfte es einfacher sein, statt der Umwandlung in (w)string direkt mit den äquivalenten Methoden der CString zu arbeiten - in deinem Code brauchst du Find() anstelle von find(), Delete() statt erase() - und -1 statt string::npos.
-
alles klar, danke, dann schau ich mir mal die beschreibung der prozeduren an, weil die parameter sehen anders aus is mit beim kleinen test aufgefallen...
-
Hi nochmal, ich habe meinen code nun n bissl geordnet da ich ihn eh neu machen musste (.rc ausversehn überschrieben)
nun bekomm ich folgende fehlermeldung:
error C2664: 'void __cdecl CString::Format(const unsigned short *,...)' : cannot convert parameter 1 from 'char [3]' to 'const unsigned short *'Für diese zeile:
cs_debug.Format("%d",i_length);Deklarationen usw:
CString cs_eingabe, cs_ip, cs_port, cs_debug;
int i_length=cs_ip.GetLength();
cs_debug.Format("%d",i_length);
MessageBox(cs_debug,NULL,MB_OK);kann mit dem fehler an sich leider nix anfanegn

Weis jemand Rat?
Gruß Basti
-
Benutz mal die Suchfunktion - Stichwort "UNICODE"

-
or nein, nich schonwieder die sache mit Unicode

das hat mir doch bisher immer schon probleme bereitet
-
Versuch es mal mit: cs_debug.Format(_T("%d"),i_length);
Wenns das war gewöhn dir einfach an, ALLE Zeichenketten so zu schreiben.
Irgendwann geht es so automatisch, dass man sich einen "abbricht", wenn man mal Code ohne schreiben will.
-
ok super, das war es
aber jetz mal ehrlich... dauernd seh ich dieses _T und dass viele Fehler damit behoben wurden usw, aber: Was zur Hölle wird durch den befehl bewirkt???//edit:
ok, konnte es compilen, aber die 2. MessageBox gibt mir "0" aus, warum???CString cs_eingabe, cs_ip, cs_port, cs_debug; m_edit_eingabe.GetLine(0, cs_eingabe.GetBuffer(m_edit_eingabe.LineLength(0)),265); MessageBox(cs_eingabe,NULL,MB_OK); int i_pos=cs_eingabe.Find(':',0); //strcpy(cs_ip, cs_eingabe); cs_ip=cs_eingabe; int i_length=cs_ip.GetLength(); cs_debug.Format(_T("%d"),i_length); cs_ip.Delete(i_pos,4); MessageBox(cs_debug,NULL,MB_OK); // Ausgabe: 0
-
sebastian87 schrieb:
ok super, das war es
aber jetz mal ehrlich... dauernd seh ich dieses _T und dass viele Fehler damit behoben wurden usw, aber: Was zur Hölle wird durch den befehl bewirkt???Es sorgt dafür, daß die String-Literale in den richtigen Typ dargestellt werden - je nach Optionen wird aus _T("...") entweder "..." (ANSI-Build - "normales" char-Array) oder L"..." (UNICODE-Build - wchar_t-Array).
(wenn du dich mal etwas intensiver mit Unicode auseinandersetzt, erkennst du auch die Feinheiten und Unterschiede ;))
Zu deinem edit: Hast du mal im Debugger verfolgt, was da passiert? Ich sehe auf Anhieb nur, daß du den mit GetBuffer() angeforderten Speicher nicht mit ReleaseBuffer() zurückgegeben hast - und daß die Größenangabe für GetLine() nicht wirklich zum real reservierten Platz passt.
-
okay, ich habe meinen code jetz noch ein wenig verändert:
CString cs_eingabe, cs_ip, cs_port, cs_debug; cs_eingabe.ReleaseBuffer(); cs_ip.ReleaseBuffer(); cs_port.ReleaseBuffer(); cs_debug.ReleaseBuffer(); m_edit_eingabe.GetLine(0, cs_eingabe.GetBuffer(m_edit_eingabe.LineLength(0)),25); MessageBox(cs_eingabe,NULL,MB_OK); //Ausgabe: RO-DV-265:1100 int i_pos=cs_eingabe.Find(':',0); cs_ip=cs_eingabe; //int i_length=cs_ip.GetLength(); int i_length=cs_eingabe.GetLength(); cs_debug.Format(_T("%d"),i_length); cs_ip.Delete(i_pos,(i_length - i_pos)); MessageBox(cs_debug,NULL,MB_OK); //AUsgabe: 0 MessageBox(cs_ip,NULL,MB_OK); //Ausgabe: RO-DV-265:1100Nach einigem fummeln gibt mir der debugger nun z.B. das hier aus:
pos=-1 in der Zeile int i_pos=cs_eingabe.Find(':',0); aber cs_eingabe {"RO-DV-265:1100"}in der zeile int i_length=cs_eingabe.GetLength(); gibt er aus i_length=0
//edit: Habe nun einige Bilder vom debuggen in einer .rar auf rapidshare.com hochgeladen. Wär nett wenn ihr euch die mal anschaut.
http://rapidshare.com/files/62969788/Eigene_Bilder.rar.htmlGruß Basti
-
sebastian87 schrieb:
CString cs_eingabe, cs_ip, cs_port, cs_debug; cs_eingabe.ReleaseBuffer(); cs_ip.ReleaseBuffer(); cs_port.ReleaseBuffer(); cs_debug.ReleaseBuffer();Warum hast Du hier ReleaseBuffer eingebaut? Du hast doch gar keinen GetBuffer verwendet!
Warum liest Du nicht was man Dir schreibt, oder zumindest was in der MSDN steht dazu?sebastian87 schrieb:
m_edit_eingabe.GetLine(0, cs_eingabe.GetBuffer(m_edit_eingabe.LineLength(0)),25); MessageBox(cs_eingabe,NULL,MB_OK); //Ausgabe: RO-DV-265:1100Jetzt musst Du cs_eingabe.ReleaseBuffer(); durchführen weil Du einen GetBuffer gemacht hast, aber das tust Du nicht.
Einfacher wird das ganze mit der Verwednung von CStrBuf!
Der nachfolgende Code kann nicht funktionieren, weil er immer noch denkt cs_eingabe ist leer!sebastian87 schrieb:
int i_pos=cs_eingabe.Find(':',0); cs_ip=cs_eingabe; //int i_length=cs_ip.GetLength(); int i_length=cs_eingabe.GetLength(); cs_debug.Format(_T("%d"),i_length); cs_ip.Delete(i_pos,(i_length - i_pos)); MessageBox(cs_debug,NULL,MB_OK); //AUsgabe: 0 MessageBox(cs_ip,NULL,MB_OK); //Ausgabe: RO-DV-265:1100Die Ausgabe von 0 ist logisch!
-
das mit dem releasebuffer hab ich lediglich gemacht weil geschrieben wurde ich soll es machen, und wenn ich es ans ende des programms gemacht habe (was mir logisch erscheint) hat er mir während der Laufzeit n fehler ausgegeben, hab ich es eben testweise nur mal an Anfang gemacht, um evtl. Speicher vom letzten Programmaufruf zu leeren
//edit: Anscheinend hab ich die Funktion von releasebuffer falsch verstanden oO
Gruß Basti