Seltsame Sonderzeichen?



  • pixartist schrieb:

    speicherlecks?

    Ich wußte das er das sagen würde... 😉





  • 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. Byte

    Jetzt 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[(i
    9)-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... 😉


Anmelden zum Antworten