Seltsame Sonderzeichen?
-
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...
