sonderzeichen in file??? -> absturz :(



  • Das Schlüsselwort inline bewirkt bei den Compilern (die es unterstützen), dass der Inhalt der Funktion an der Stelle des Funktionsaufrufes ausgebreitet wird. Das kann man sich so wie eine einfache Textersetzung vorstellen. Der Vorteil ist, dass der Overhead der bei einem Funktionsaufruf entsteht vermieden wird, weil der Funktionscode direkt an der Aufrufstelle ausgeführt wird, und dadurch keine Parameter auf den Stack gepushed bzw. keine Rücksprungadresse gespeichert werden müssen. Der Nachteil hingegen, ist, dass der Programmcode sich dementsprechend aufbläht aber der intelligente Compiler entscheidet ohnehin ob es sinnvoll ist die Funktionen auszubreiten oder nicht (man kann es mit einem speziellen Schlüsselwort jedoch erzwingen).

    Ich habe übrigens einen schlimmen Fehler in meiner Funktion gemacht, hab' nämlich das 'return' vergessen.

    inline int GetEditTextLength(HWND hWnd)
    {
      return SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0);
    }
    


  • Aziz schrieb:

    Das Schlüsselwort inline bewirkt bei den Compilern (die es unterstützen), dass der Inhalt der Funktion an der Stelle des Funktionsaufrufes ausgebreitet wird. Das kann man sich so wie eine einfache Textersetzung vorstellen. Der Vorteil ist, dass der Overhead der bei einem Funktionsaufruf entsteht vermieden wird, weil der Funktionscode direkt an der Aufrufstelle ausgeführt wird, und dadurch keine Parameter auf den Stack gepushed bzw. keine Rücksprungadresse gespeichert werden müssen. Der Nachteil hingegen, ist, dass der Programmcode sich dementsprechend aufbläht aber der intelligente Compiler entscheidet ohnehin ob es sinnvoll ist die Funktionen auszubreiten oder nicht (man kann es mit einem speziellen Schlüsselwort jedoch erzwingen).

    Ich habe übrigens einen schlimmen Fehler in meiner Funktion gemacht, hab' nämlich das 'return' vergessen.

    inline int GetEditTextLength(HWND hWnd)
    {
      return SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0);
    }
    

    jo dankee klappt..n kleiner tipp noch ;):

    inline int GetEditTextLength(HWND hWnd)
    {
      return SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0)+1;
    }
    

    achja wenn mir schon grad n profi fragen beantwortet 🕶 :
    wieso hab ich am textende sowas: ýýýý oder auch sowas: ýýýýÝÝÝÝÝÝî? , wenn ich was lade?

    ladefunktion:

    char *LoadFileToObj(char* file)
    {
    	FILE *topen;
    		if((topen = fopen(file, "rb")) != NULL)
    		{
    			int fileSize;
    			fseek(topen, 0, SEEK_END);
                fileSize = ftell(topen);
    			if(fileSize!=0) {
    				char *buffer;
    				buffer = new char[fileSize];
    				fseek(topen, 0, SEEK_SET);
    				fread(buffer, 1, fileSize, topen);
    				fclose(topen);
    				return buffer;
    			}
    		}
    
    	return "File is empty or does not exist!";
    }
    

    aufruf:

    if(LOWORD(wParam)==1) 
    		{
    			toLoad = new char[GetEditTextLength(loadEdit)];
    			GetWindowText(loadEdit, toLoad, GetEditTextLength(loadEdit));
    			SetWindowText(textField, LoadFileToObj(toLoad)); 
    		}
    

    danke!



  • Kannst du natürlich machen. Aber für gewöhnlich geben solche Funktionen die Textlänge exklusive des NULL-Zeichens zurück...Du ersparst dir kurzläufig zwar das +1 beim allozieren von Textspeicher aber es könnte dir irgendwann passieren, dass du ständig 1 von der Länge abziehen musst...



  • achja wenn mir schon grad n profi fragen beantwortet :
    wieso hab ich am textende sowas: ýýýý oder auch sowas: ýýýýÝÝÝÝÝÝî? , wenn ich was lade?

    Hmm, das könnte vielleicht daran liegen, dass du diese Zeichen auch tatsächlich in der Datei drinnen stehen hast (also falls wir davon ausgehen, dass deine Funktion richtig funktioniert). Andererseits kann's daran liegen, dass du den String einer Funktion übergibst, die einen null-terminierten String erwartet (es läuft dann so lange im Speicher wild herum bis es eine Null gefunden hat, denn dann weiß er: "Aha! Hier hört der String auf."). Ich hab deine Funktion mal verbessert:

    char *LoadFileToObj(char* file) 
    { 
        FILE *topen; 
            if((topen = fopen(file, "rb")) != NULL) 
            { 
                int fileSize; 
                fseek(topen, 0, SEEK_END); 
                fileSize = ftell(topen); 
                if(fileSize!=0) { 
                    char *buffer; 
                    buffer = new char[fileSize+1];
                    buffer[fileSize] = 0; // Wichtig: String null-terminieren
                    fseek(topen, 0, SEEK_SET); 
                    fread(buffer, 1, fileSize, topen); 
                    fclose(topen);
    
                    return buffer; 
                } 
            } 
    
        return NULL; // Am besten du gibst NULL bei Zeigern zurück wenn es einen Fehler gab
    }
    


  • oder deinen Speicher (falls du mehr reserviert hast, als du nachher reinliest) vorher mit ZeroMemory initialisieren bzw. nach dem Einlesen eben entsprechend der Anzahl der eingelesenen Zeichen das 0-Zeichen reinsetzen.



  • aziz hatte recht, flenders nicht ^^ ich hab mit zero memory nach dem initialisieren von buffer allen inhalt von buffer auf 0 gesetzt, fehler trotzdem da...aziz' funktion klappt!
    wie kann ich n int in nen char* umwandeln?
    char *lol = char(sizeof(toLoad));
    so gehts nich 😞

    btw.: danke nochmal für die nette hilfe hier 😉



  • flenders hatte eigentlich nur meine Worte ergänzt. Er hatte nicht in Frage gestellt ob ich Recht habe oder nicht...



  • Mit itoa() kannst du einen Integer in einen String umwandeln.



  • war ja nicht bös gemeint 😉
    danke!



  • pixartist schrieb:

    war ja nicht bös gemeint 😉
    danke!

    Das nahm ich auch nicht an 😉



  • wo wir so schön dabei sind...wie heisst die msg um die schriftart eines textedits zu ändern?
    thx
    👍



  • Die heißt WM_PIXARTIST_MUSS_ERSTMAL_EIN_C++_TUTORIAL_DURCHLESEN, gefolgt von WM_PIXARTIST_MUSS_ERSTMAL_EIN_WINAPI_TUTORIAL_DURCHLESEN



  • ich bin mal nicht so gemein - WM_SETFONT 😉

    Aber der von Hepi vorgeschlagene Weg ist sicher der langfristig bessere. 🕶


Anmelden zum Antworten