c++ *char == '='


  • Mod

    @Mechanics Das kommt daher, dass der Moderator sich dazu erbarmt, Code-Tags für den Sprössling einzufügen. "Danke, Papa." Gern geschehen.


  • Administrator

    @Columbo sagte in c++ *char == '=':

    @Mechanics Das kommt daher, dass der Moderator sich dazu erbarmt, Code-Tags für den Sprössling einzufügen. "Danke, Papa." Gern geschehen.

    Das war Mechanics wohl klar. Aber du bist irgendwie nicht Arcoth ... nicht mehr 😜


  • Mod

    @Dravere 😰 😰 😰 Ups......

    Das kommt eben davon, wenn man sich ständig umbenennt: Die anderen halten nicht mit, nennen einen Arcoth und dann passiert sowas. 😛



  • @PCGirl sagte in c++ *char == '=':

    Hat das vielleicht etwas mit dem "i als Variablenname" zu tun, wovon Mittagspause geredet hat?

    Das ist ja witzig 🙂 Ich hatte von 'l' (kleines 'L') als Variablennamen abgeraten, weil er leicht mit 'i' etc verwechselt wird.

    Aber ernsthaft:

    @Columbo sagte in c++ *char == '=':

    @PCGirl Erwirb erstmal ein gutes Fachbuch, z.B. den C++-Primer. Ohne wirst Du mit Deinen mediokren Java-Kenntnissen nur voellig muelliges C++ fabrizieren. Wie oben. Ist nicht persönlich gemeint, genauso wie @SeppJ es nicht persönlich gemeint hat, Deinen Code als Mist abzustempeln. Aber man merkt, dass Du nicht in der Lage bist, mit der Diskussion hier richtig Trab zu halten, deshalb bedarf es nach guter, literarischer Fundierung. Wir können noch 20 Beitraege ueber irgendwelche flüchtigen Fehler austauschen, die sich in Deinen Code einschleichen. Aber das wird dir langzeitlich nicht zum Erfolg helfen.

    Da möchte ich mich anschließen.



  • @SeppJ Welche Punkte an Pascal sind denn komisch, Syntax?


  • Mod

    @HarteWare sagte in c++ *char == '=':

    @SeppJ Welche Punkte an Pascal sind denn komisch, Syntax?

    Nein, die Syntax ist sauber. Sehr sauber sogar. Es sind so komische Sprachkonzepte, die vermeintlich anfängerfreundlich sind, aber im Endeffekt dafür sorgen, dass die Sprache komisch funktioniert, und der Anfänger das Gelernte dann nicht auf "normale" Systeme übertragen kann. Wie eben diese komischen Dateiobjekte, die magisch im Voraus wissen, dass sie vorm EOF stehen. Mag mit normalen Dateien funktionieren, aber dann kann man die gleichen Konzepte nicht auf andere Datei-artige Dinge anwenden, bei denen das nicht mehr möglich ist. Oder die komischen Strings, die die schlechtesten Eigenschaften von statischen Arrays und dynamisch terminierten Strings kombinieren.



  • @Columbo Oh, das hab' ich gar nicht gewusst. Ich hab' die Änderung gesehen, war aber irgendwie mit den Gedanken woanders bisher. Jetzt wo du's sagst ist es zweifellos sehr nett, dass du mir helfen wolltest. Leider muss ich gestehen, dass ich nicht weiß, welche Funktion das hatte, sorry. Aber danke schon mal. Werde mich dann mal über das Stichwort Arcoth informieren.


  • Mod

    @PCGirl wat. Arcoth war mein ehemaliger Forumname. Code-Tags funktionieren indem Du den </> Button klickst. Syntax Highlighting und so.



  • @PCGirl sagte in c++ *char == '=':

    @Quiche-Lorraine Was du da sagst, stimmt sicher, obwohl ich da noch keine Ahnung habe, aber dieser Teil des Quellcodes hat anfangs einwandfrei funktioniert, als ich nur ein Wort bzw. ein Zeichen (A) in der Datei hatte und dieses ausgelesen und ins Fenster implementiert habe. Sie wird auch erst nach der Methode translateLine() aufgerufen, und darin sind zwei Schleifen, die beim Debuggen ungewöhnliches Verhalten zeigen. Übrigens, ich weiß nicht, ob das relevant ist, aber ich benutze eine Fensterdatei mit einer WinMain, und auch die drei gezeigten Methoden befinden bis jetzt alle in dieser.

    Der Krux an der Sache ist aber, nur weil etwas scheinbar funktioniert, bedeutet dies noch lange nicht, dass es fehlerfrei ist.

    Deine Funktion to_wchar_t gibt einen Zeiger auf ein allokiertes wchar_t Array zurück. Doch wer gibt diesen allokierten Speicher wieder frei? Da ist kein Garbage Collector welcher einem automatisch aufräumt! Der Speicher ist belegt und wird solange nicht mehr freigegeben bis der Prozess terminiert.

    Deine Funktion initTextValues() hat ein Speicherloch. Pro Aufruf verlierst du mindestens 256 * 2 + 257 * (Anzahl von Zeilen in TextFile1.properties) Bytes an Speicher. Hat deine Datei TextFile1.properties 100 Zeilen, verlierst du pro Aufruf von initTextValues() 25 kByte RAM. Rufst du die Funktion 10000 mal auf, verlierst du 249 MByte an Ram.

    void initTextValues() {
    	int max_length = 256;
    	fstream f;
    	char* key = new char[max_length];  // Speicherloch 1. Speicher wird nicht freigegeben.
    	char* value = new char[max_length];  
    	char* line = new char[max_length];  // Speicherloch 2
    	f.open("TextFile1.properties", ios::in);
    	int i = 0;
    	while (!f.eof())
    	{
    		f.getline(line, sizeof(line));
    		translateLine(line,key,value);
    		title = to_wchar_t(value);  // Speicherloch 3
    	}
    	f.close();
    	delete[] value;
    }
    

    Ich habe solche Fehler schon in der Maus Event Funktion einer speziellen Lib gefunden. Pro Mausbewegung verlor das Programm ein paar Bytes an RAM. Nach 5 Minuten Mausbewegung fror das System (Unix Derivat) ein, da das System fast den gesamten RAM für das Programm benötigte.

    Mein Tipp. Probiere es doch mal aus. Sichere deine Daten, beende alle offenen Programme außer deiner IDE und rufe initTextValues() 10, 100, 1000, 10000, 10000000000 mal auf und schaue dir mal den Speicherverbrauch mittels Prozess Explorer an. Aber Achtung! Ich denke dass dein Program ab einer gewissen Größe eine Exception auslöst und sich daduch beendet. Ich bin mir aber nicht sicher wie stabil da Windows bleibt.



  • @PCGirl
    Was passiert eigentlich wenn du in initTextValues() mal eine Zeile einliest, die mehr als 256 Zeichen hat? Denk mal drüber nach 😉


Anmelden zum Antworten