Seltsame Sonderzeichen?
-
void WriteLineNumbers(HWND hwnd, HWND hTarget) { int numLines = GetLineCount(hwnd); char *tmp = new char[strlen(WindowText(hTarget))+5+2]; for(int i = 0;i<=numLines;++i) { char *ic = new char[sizeof(i)]; itoa(i,ic,10); char *ret = new char[strlen(CombinChars(CombinChars(WindowText(hTarget),ic),"\r\n"))]; ZeroMemory(ret,sizeof(ret)); ret = CombinChars(WindowText(hTarget),ic); ret = CombinChars(ret,"\r\n"); SetWindowText(hTarget,ret); } }damit schreibe ich die zeilennummern in ein fenster...das problem ist, dass ich vor der "8" immer ein "!" habe. Auch bei anderen zeilen schleichen sich jedoch immer wieder seltsame sonderzeichen ein! Könnt ihr mir vielleicht sagen wie ich das verhindere bzw woran es liegt?
edit:problem gelößt...
-
edit:problem gelößt...
die speicherlecks auch?
-
speicherlecks?
ic hat jetzt ne konstnate länge von 5...
-
pixartist schrieb:
speicherlecks?
Ich wußte das er das sagen würde...

-
jedes new braucht ein delete
http://tutorial.schornboeck.net/dyn_speicher.htm
-
wieso stürtzt das jetzt ab?
char *CombinChars(char *char1, char *char2) { char *tmp = new char[strlen(char1)+strlen(char2)]; ZeroMemory(tmp,strlen(char1)+strlen(char2)); for(int i=0;i<=strlen(char1);++i) { tmp[i] = char1[i]; } for(int x=0;x<=strlen(char2);++x) { tmp[x+strlen(char1)] = char2[x]; } return tmp; }...
void WriteLineNumbers(HWND hwnd, HWND hTarget, int oldLineCount) { int ToChange = oldLineCount-GetLineCount(hwnd); if(ToChange != 0) { char *winText; winText = ""; SetWindowText(hTarget,winText); int numLines = GetLineCount(hwnd); char *ic = new char[5]; if(numLines>99999) { PostQuitMessage (0); } for(int i = 0;i<=numLines;++i) { itoa(i,ic,10); //char *ret = new char[strlen(CombinChars(CombinChars(WindowText(hTarget),ic),"\r\n"))]; char *ret = new char[i*9]; ret = CombinChars(winText,ic); ret = CombinChars(ret,"\r\n"); delete [] winText; winText = new char[strlen(ret)]; winText = ret; } SetWindowText(hTarget,winText); } ScrollToSamePos(hwnd,hTarget); }edit und habt ihr ne idee wie ich an die charlänge von ic und somit auch von ret komme?
-
strlen liefert nur die Anzahl der Zeichen ohne Null-Terminierung!
x<=strlen(char2) sagt mir das du die Null-Terminierung mitkopierst aber du scheinst dafür gar keinen Speicher reserviert zu haben...
-
was? und wie mache ich ne null-terminierung? ^^
-
Sagen wir mal char1 sähe so aus:
char1[0]='T';
char1[1]='e';
char1[2]='s';
char1[3]='t';
char1[4]='\0'; // Null-Terminierung. Wenns strlen dieses Zeichen findet, weiss es
dass der String zu ende ist.und char2 so:
char2[0]='b';
char2[1]='l';
char2[2]='a';
char2[3]='\0';strlen(char1) liefert 4 und strlen(char2) liefert 3
Jetzt reservierst du für tmp 7 Byte an Speicher.
Und kopierst die zeichen 0 bis 4, also char1[0] bis char1[4] in tmp:tmp[0]='t'; // 1. Byte
tmp[1]='e'; // 2. Byte
tmp[2]='s'; // 3. Byte
tmp[3]='t'; // 4. Byte
tmp[4]='\0'; // 5. Byte
tmp[5]=irgendnenWert; // 6. Byte
tmp[6]=irgendnenWert; // 7. ByteJetzt willst du string2 scheinbar drankopieren:
tmp[x+strlen(char1)] wäre also tmp[0+4] also wiederrum tmp[4]
Du überschreibst also zuerst einmal die mitkopierte Nullterminierung.
und kopierst jetzt von tmp[4] bis tmp[strlen(char2)+strlen(char1)] quasi char2 darein.tmp[strlen(char2)+strlen(char1)] wäre tmp[3+4], also tmp[7]
Nun hast du nur Speicher für maximal tmp[6] (tmp[0] bis tmp[6] sind 7 Bytes) reserviert, dir fehlt ein Byte (tmp[0] bis tmp[7] wären 8 Byte).
Du kopierst also über den reservierten Speicher hinaus was unter Umständen eine Speicherverletzung gibt.Du musst also nur 1 Byte mehr Speicher reservieren für die letzte Null-Terminierung.
Du könntest dir die for-Schleifen sparen und stattdessen memcpy() benutzen...
Du könntest auch strcpy() und strcat() benutzen...
-
-
char *CombinChars(char *char1, char *char2) { char *tmp = new char[strlen(char1)+strlen(char2)+1]; //--------------------------------->tmp nicht nullterminiert ^^ memcpy(tmp,char1,strlen(char1)); memcpy(tmp+strlen(char1),char2,strlen(char2)); /*for(int i=0;i<=strlen(char1);++i) { tmp[i] = char1[i]; } for(int x=0;x<=strlen(char2);++x) { tmp[x+strlen(char1)] = char2[x]; }*/ return tmp; }void WriteLineNumbers(HWND hwnd, HWND hTarget, int oldLineCount) { int ToChange = oldLineCount-GetLineCount(hwnd); if(ToChange != 0) { char *winText; winText = ""; SetWindowText(hTarget,winText); int numLines = GetLineCount(hwnd); char *ic = new char[5]; ic[5] = '\0'; if(numLines>99999) { PostQuitMessage (0); } for(int i = 0;i<=numLines;++i) { itoa(i,ic,10); //char *ret = new char[strlen(CombinChars(CombinChars(WindowText(hTarget),ic),"\r\n"))]; char *ret = new char[(i)*9]; ret[(i*9)] = '\0'; winText[strlen(winText)] = '\0'; ret = CombinChars(winText,ic); ret = CombinChars(ret,"\r\n"); delete [] winText; winText = new char[strlen(ret)]; winText[strlen(ret)] = '\0'; winText = ret; } SetWindowText(hTarget,winText); } ScrollToSamePos(hwnd,hTarget); }stürtzt immernoch ab oO
btw muss ich so nullterminieren:
ret[(i9)] = '\0';
oder so:
ret[(i9)-1] = '\0';
bei ersten schreibe ich ja im grunde über die länge raus und bei zweiten schneide ich den letzten char ab ...edit: ich glaube jetzt stürtzt es nichtmehr ab:
void WriteLineNumbers(HWND hwnd, HWND hTarget, int oldLineCount) { int ToChange = oldLineCount-GetLineCount(hwnd); if(ToChange != 0) { char *winText; winText = ""; SetWindowText(hTarget,winText); int numLines = GetLineCount(hwnd); char *ic = new char[6]; ic[5] = '\0'; if(numLines>99999) { PostQuitMessage (0); } for(int i = 0;i<=numLines;++i) { itoa(i,ic,10); //char *ret = new char[strlen(CombinChars(CombinChars(WindowText(hTarget),ic),"\r\n"))]; char *ret = new char[(i*9)+1]; ret[(i*9)] = '\0'; winText[strlen(winText)] = '\0'; ret = CombinChars(winText,ic); ret = CombinChars(ret,"\r\n"); delete [] winText; winText = new char[strlen(ret)+1]; winText = ret; } SetWindowText(hTarget,winText); } ScrollToSamePos(hwnd,hTarget); }dafür hab ich jetzt nen andren bug...ich such mal den fehler ^^
edit: also wenn ich die erste datei lade ist noch alles ok, aber wenn ich dann irgendwas ändere dann spacken die zahlen richtig ab

EDIT(mal wieder): habt ihr ne idee wie man die funktion schneller gestalten kann?
-
@hepi
du gibst es nicht auf.
-
miller_m schrieb:
@hepi
du gibst es nicht auf.
Na, die fehlenden Grundlagen werden doch immer offensichtlicher...
