Verbesserungsvorschläge und Kritik



  • n0stradamus schrieb:

    @Nexus: Mittlerweile habe ich die char-Arrays durch strings ersetzt und brav mit new und delete [] gearbeitet. Was kann ich denn noch tun um den Speicher dynamischer zu verwalten ?

    Nexus schrieb:

    In C++ hast du die STL, std::string und Konsorten, welche dir viele Arbeit und Mühe abnehmen. Vielleicht hilft dir das als Einstieg.



  • Hm...dumm von mir, das nicht anzuwenden.
    Wie groß ist die Wahrscheinlichkeit, dass beispielsweise ein Vektor mein Programm zum Laufen bringt ?^^



  • n0stradamus schrieb:

    Wie groß ist die Wahrscheinlichkeit, dass es mein Programm zum Laufen bringt ?^^

    Kann ich so nicht sagen, aber ein Blick auf die STL lohnt sich auf alle Fälle. new und delete solltest du jedoch mit der Zeit auch verstehen, auch wenn manuelle Speicherverwaltung im Anwendungscode eher selten vorkommen sollte.



  • Hi,

    habe das Problem mit einer Queue gelöst, hat der Übersichtlichkeit halber eine Funktion mehr gefordert aber jetzt läuft das Programm schön und stabil 😃
    Vielen Dank für Eure Hilfe, irgendwann bin ich ja vllt auch so weit, dass ich euch mal helfen kann :p

    Eines hat mich allerdings doch gestört:

    Angenommen, vorher wurde definiert:

    string *real;
    real = new string;
    

    //Über den Sinn lässt sich jetzt streiten

    Dann produziert diese Zeile einen Fehler, wenn ich den Pointer durch einen richtigen String ersetze allerdings nicht:

    if((*real).find(' ')==0)
    	{
    		for(int o=0;0<(*real).size();o++)
    			{(*real)[o] = (*real)[o+1];} //Leerstelle an erster Stelle eliminieren, wenn es eins gibt
    	}
    //Zum besseren Verständnis:
    //real ist der String, der die fertig bearbeitete Beschreibung der Person enthält
    

    Warum ist das so?
    delete habe ich hinterher natürlich benutzt 🙂



  • Da du jetzt keinen Zeiger mehr hast, musst du auch nichts dereferenzieren, bevor du auf Memberfunktionen zugreifen willst.

    // Zeiger auf dynamisch angelegtes Objekt
    std::string* ptr = new std::string("hallo");
    (*ptr).clear();  // Zugriff über (*ptr).
    ptr->clear();    // oder über ptr->
    delete ptr;
    
    // Automatisches Objekt
    std::string obj("hallo");
    obj.clear();     // Zugriff über obj.
    

    Bei automatischen Objekten hast du hoffentlich kein delete benutzt. 😉

    Ausserdem ist der folgende Code ziemlich ineffizient.

    if((*real).find(' ')==0)
    	{
    		for(int o=0;0<(*real).size();o++)
    			{(*real)[o] = (*real)[o+1];} //Leerstelle an erster Stelle eliminieren, wenn es eins gibt
    	}
    

    Wenn du wissen willst, ob an erster Stelle ein Leerzeichen ist, schaust du doch dort nach. Was du machst, ist aber den ganzen String nach Leerzeichen durchsuchen und überprüfen, ob das erste Vorkommen an der Position 0 steht. Fürs Löschen gibt es auch bereits vorhandene Funktionalität. Schau zuerst hier, ob du nicht etwas nochmal von neu erfindest, std::string hat sehr viele Methoden (etwas zu viele...) und ausserdem gibts noch die generischen STL-Algorithmen.

    Eine schnellere und einfachere Implementierung sähe so aus:

    if (real[0] == ' ')
        real.erase(0);
    


  • Nexus schrieb:

    Da du jetzt keinen Zeiger mehr hast, musst du auch nichts dereferenzieren, bevor du auf Memberfunktionen zugreifen willst.

    // Zeiger auf dynamisch angelegtes Objekt
    std::string* ptr = new std::string("hallo");
    (*ptr).clear();  // Zugriff über (*ptr).
    ptr->clear();    // oder über ptr->
    delete ptr;
    
    // Automatisches Objekt
    std::string obj("hallo");
    obj.clear();     // Zugriff über obj.
    

    Bei automatischen Objekten hast du hoffentlich kein delete benutzt. 😉

    Dereferenziert und -d habe ich bei dem automatischen Objekt nicht^^
    Dann muss ich meine Frage nochmal anders formulieren:
    So wie du den Code oben siehst, als dereferezierte Version mit der geltenden Annahme, dass real ein Zeiger auf einen dynamisch angelegten String ist, so produziert das einen Fehler.

    Hebe ich allerdings die Dereferenzierung auf und mache

    real
    

    zu einem automatischen Objekt, so läuft das Ganze fehlerfrei. Warum?
    Einen Unterscheid beim Verbrauch von Speicher gibt es doch nicht oder ?

    real wird beim Schließen der Funktion in der es sich befindet ja wieder gelöscht.

    PS:
    Aber Danke für den Hinweis, dass es meine Funktion schon in anderer Form gibt^^
    Wenn es so viele Extrabefehle gibt, muss man ja gar nicht mehr basteln 🙂



  • n0stradamus schrieb:

    So wie du den Code oben siehst, als dereferezierte Version mit der geltenden Annahme, dass real ein Zeiger auf einen dynamisch angelegten String ist, so produziert das einen Fehler.

    Was für einen Fehler? Kannst du den momentanen Code nochmals posten?



  • Klaro,

    Das hier läuft schief:

    if((*real).find(' ')==0)
        {
            for(int o=0;0<(*real).size();o++)
                {(*real)[o] = (*real)[o+1];} //Leerstelle an erster Stelle eliminieren, wenn es eins gibt
        }
    //Zum besseren Verständnis:
    //real ist der String, der die fertig bearbeitete Beschreibung der Person enthält
    

    Diese Variante hingegen läuft problemlos:

    if(real.find(' ')==0)
    	{
    		for (int l=0;l<real.size();l++)
    		{
    			real[l]=real[l+1];
    		}
    		//Leerstelle an erster Stelle eliminieren, wenn es eine gibt
    	}
    

    Der restliche Funktionsaufbau ist genau gleich (mal von der Initialisierung von real abgesehen)



  • Naja, ich habe eigentlich nach dem Fehler gefragt, und die Deklaration wäre auch nicht schlecht gewesen.

    Wie auch immer, der Funktionsaufbau ist eben nicht gleich.

    for(int o=0;0<(*real).size();o++)
    //          ^
    

    Der Code wäre übrigens lesbarer, wenn du mehr Leerzeichen hättest und operator-> verwenden würdest.



  • Nexus schrieb:

    [/cpp]
    Der Code wäre übrigens lesbarer, wenn du mehr Leerzeichen hättest und operator-> verwenden würdest.

    Uppsala, dumm von mir 😞
    Aber trotzdem:
    Danke für die Hilfe, war sehr lehrreich!


Anmelden zum Antworten