c++ *char == '='



  • @manni66 Da fällt mir ein, ich habe gestern irgendwo gelesen, dass damit zu tun hat, wenn man windows.h includiert. Ich weiß nicht, worum ich das drin habe, benutze Microsoft Visual Studio mit Windows 10, werde mal probieren, wie's ohne ist.



  • @manni66 Du hast mir geraten dem Fenster char statt wchar_t zu geben. Habe ich auch versucht, klappt aber nicht.



  • Nach der Änderung von "for (i < strlen(line); i++; l++)" in "for (; i < strlen(line); i++, l++)" funktioniert es auf einmal. Allerdings wird als Titel "TerminverwaltungIIIIIIIIIIIIIIIIIIIIIIIIIII...." (mit Strich über jedem I) ausgeben. Hat das vielleicht etwas mit dem "i als Variablenname" zu tun, wovon Mittagspause geredet hat? Ich muss sagen, ich finde das hochinteressant, gerade weil es von Java so gar nicht kenne. Auch das mit dem Garbage Collector, was Quiche Lorrain gesagt hat, und anderes, was hier so in den Antworten steht.



  • @manni66 Habe jetzt versucht, windows.h rauszunehmen, aber dann werden ein paar meiner Klassentypen, z. B. "LRESULT" nicht mehr erkannt. Ich muss zugeben, dass Microsoft Visual Studio verwende, wo man sich einiges generieren lassen kann, und dann habe ich eine Open Source-Lösung aus dem Internet kopiert, um mir ein Fenster mit Tabs machen zu lassen.


  • Mod

    @PCGirl value ist nicht nullterminiert.



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

    @manni66 Du hast mir geraten dem Fenster char statt wchar_t zu geben.

    Nein!



  • @PCGirl Wie kommst du darauf, Windows.h zu entfernen? Manni hat dir außerdem nicht geraten, dem Fenster char statt wchar_t zu geben.

    std::wstring hat wide chars, std::string chars. Auf die unterliegenden Daten kommst du jeweils mit .c_str().

    Lies vielleicht mal das hier dazu: https://stackoverflow.com/questions/402283/stdwstring-vs-stdstring


  • Mod

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

    @SeppJ Das musst du mir genauer erklären.

    Was soll man da genauer erklären? Du hast leider Mist gelernt, vermutlich aufgrund schlechten Materials anstatt aus eigener Dummheit. So sieht C++ nicht aus. So sieht eigentlich nicht einmal C aus, wenn man es richtig macht. Was du da programmiert hast, ist schlechtes C, bei dem man malloc mit new ersetzt hat, damit es irgendwie mehr wie C++ aussieht. Was zeigt, dass der Lehrer nicht nur schlecht C spricht, sondern auch nicht weiß, dass ein sichtbares new in C++ ein Alarmsignal für schlechten Code ist. Ebenso deine Einleseschleife, die wie schon gesagt in jeder Sprache falsch ist. Und ganz viele weitere Sachen. Eigentlich so ziemlich alles in deinem kurzen Code.

    Da kann man jetzt nicht im Details ausbessern. In richtigem C++ würde man das ganze Programm komplett anders aufziehen und dann würde auch keines deiner bekannten Probleme (und die vielen unbekannten, die du noch gar nicht bemerkt hast) überhaupt eine Chance haben, aufzutreten. Ich kann dir daher nur raten, dein Lehrbuch wegzuwerfen oder den VHS-Kurs zu kündigen. Auf jeden Fall werd deinen aktuellen Lehrer los! Von schlechten Lehrern lernt man halt nur Mist. Je tiefer du dir den Mist angewöhnst, desto schwerer wirst du ihn wieder lost. Schlimmstenfalls gibst du frustriert auf, weil aus deiner Sicht alles furchtbar umständlich und frickelig aussieht. Was es mit dieser Programmierweise ja auch ist.



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

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

    @SeppJ Das musst du mir genauer erklären.

    Was soll man da genauer erklären? Du hast leider Mist gelernt, vermutlich aufgrund schlechten Materials anstatt aus eigener Dummheit. So sieht C++ nicht aus. So sieht eigentlich nicht einmal C aus, wenn man es richtig macht. Was du da programmiert hast, ist schlechtes C, bei dem man malloc mit new ersetzt hat, damit es irgendwie mehr wie C++ aussieht. Was zeigt, dass der Lehrer nicht nur schlecht C spricht, sondern auch nicht weiß, dass ein sichtbares new in C++ ein Alarmsignal für schlechten Code ist. Ebenso deine Einleseschleife, die wie schon gesagt in jeder Sprache falsch ist. Und ganz viele weitere Sachen. Eigentlich so ziemlich alles in deinem kurzen Code.

    Da kann man jetzt nicht im Details ausbessern. In richtigem C++ würde man das ganze Programm komplett anders aufziehen und dann würde auch keines deiner bekannten Probleme (und die vielen unbekannten, die du noch gar nicht bemerkt hast) überhaupt eine Chance haben, aufzutreten. Ich kann dir daher nur raten, dein Lehrbuch wegzuwerfen oder den VHS-Kurs zu kündigen. Auf jeden Fall werd deinen aktuellen Lehrer los! Von schlechten Lehrern lernt man halt nur Mist. Je tiefer du dir den Mist angewöhnst, desto schwerer wirst du ihn wieder lost. Schlimmstenfalls gibst du frustriert auf, weil aus deiner Sicht alles furchtbar umständlich und frickelig aussieht. Was es mit dieser Programmierweise ja auch ist.

    Also, ich meinte eigentlich nur, dass mich das sehr interessiert, was du gesagt hast. Ich habe jetzt ein Jahr Java gelernt und bin auf eigene Entscheidung auf C++ umgestiegen, die Ausbilder haben es erlaubt, aber ich bringe es mir selbst bei, und du musst nicht gleich von "Mist" reden, weil macht ja gar nichts, dass es momentan noch zu Fehlern kommt.


  • Mod

    @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.


  • 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