char mit return übergeben?



  • Habs selber hinbekommen:

    char *b = in.funk();

    Danke

    Frostie



  • Optimizer schrieb:

    Entyl_Sa schrieb:

    9 Byte, wen juckt´s? 😃
    Ne, mal im ernst. Am besten dann wenn er nicht mehr benötigt wird.

    Am besten automatisch und nicht auf Verlass darauf, dass der Aufrufer das auch wirklich macht.

    Und wie würdest du das automatisch machen?



  • Mit einem Destruktor. So wie bei std::string z.B.



  • Wo ist der Unterschied ob ich jetzt delete auf einen string oder delete[] auf einen char * aufrufe?



  • Bei delete[] werden häufig die "[]" vergessen.



  • Naja, das ist aber doch kein Grund.
    Das ist weder einfacher noch automatisch.



  • Warum ist das nicht automatisch? Und warum ist das nicht einfacher, wenn man nicht mehr ans delete denken muss?
    Wenn du was mit new erstellst und einen Zeiger darauf zurückgibst, dann verlässt du dich darauf, dass irgendjemand außerhalb deiner Funktion das Ding wieder löscht.

    So schreib ich einfach:

    string foo()
    {
        [...]
        return myString;
    }
    

    Und wenn der Aufrufer meine Variable nicht mehr verwendet, löscht der Destruktor automatisch das char-Array.
    Mit deiner Funktion dagegen bist du darauf angewiesen, dass der Aufrufer dran denkt, delete[] zu machen.



  • SirLant schrieb:

    char * funktion (void) {
    return new char[8];
    }

    aber schöner ist

    string & funktion (void) {
    return new string;
    }

    und noch schöner:
    string & funktion (string * pointer) { // der Benutzer muss eine Variable übergebn die man füllt, statt heimlich new zu benutzen
    pointer = new string;
    return *string;
    }

    Das ist nicht Dein Ernst, oder?

    1. ist doof, man muß an das delete denken, auch noch ohne, daß man selbst new aufgerufen hat.
    2. Ist ein Syntax-Fehler, Du meinstes wahrscheinlich return *(new string);
      Das hat genau das gleiche Problem.
    3. Ist der Gipfel der Sache... warum bitte soll der Benutzer einen Parameter hergeben und einen Rückgabewert entgegennehmen, wenn er doch eigentlich nur einen Rückgabewert haben will. Noch dazu wird der Pointer by value übergeben, das heißt von der Veränderung kriegt man außen nichts mit.

    Schön ist zum Beispiel

    string funktion()
    {
      return "blablabla";
    }
    

    Das ist nämlich einfach, keine Gefahr vom vergessenen delete und komfortabel ist es auch.

    MfG Jester



  • Es sollte beim dritten return *pointer heißen. Das dritte Beispiel ist etwas
    schlecht formuliert, da geb ich dir recht, besser ist es wenn das Objekt bereits
    fertig ist und dann per Zeiger übergeben wird. War da wohl etwas verwirrt (deswegen auch return *string).

    Was ich meinte war:

    const matrix & fill (matrix & tabelle) {
     matrix values(99, 99 ,0) // 99 * 99 Matrix mit 0 als default Wert
     tabelle = values;
     return tabelle;
    }
    
    int main (void) {
        matrix tabelle;
        fill(tabelle);
    }
    

    So hat man das new Problem nicht, man übergibt dem Programm einfach ein Objekt
    das gefüllt wird. So spart man bei großen Objekten auch das zusätzliche kopieren.

    Hoffe jetzt ist klar was ich eigentlich mit dem dritten Beispiel meinte.
    Die Rückgabe ist nur dafür da, falls man damit weiterarbeiten möchte (matrix y = fill(tabelle) + transform;).

    Was es noch gibt sind die auto_ptr mit welchen man das Problem ja auch beseitigen kann.



  • @Optimizer:
    hab jetzt verstanden was du meinst und damit hast du natürlich recht. Du legst den String ja nicht über new an, brauchst also auch kein delete. 💡

    Das weder einfacher noch automatisch bezog sich allerdings auf den direkt vorangegangenen Post.

    Gruß
    Entyl Sa



  • Warum nicht gleich die Matrix von der Funktion erstellen lassen? Die Kopie zahlst Du eh und bei der Rückgabe kann sie vielleicht wegoptimiert werden.
    Ich halte das für ziemlichen Quatsch.



  • Boing. Bevor das hier jemand zu Hause ausprobiert: auto_ptr hilft mal wieder nix, weil es delete, nicht delete[] aufruft.



  • Worum geht es in diesem total bekloppten Thread eigentlich? Der autor wollte doch prinzipiell eine Funktion schreiben, die etwas einließt und den eingelesenen Text zurückgibt. Das hat er so nicht gesagt, war aber aus seinem "Code" erkenntlich.

    #include <string>
    using namespace std;
    
    string bla ()
    {
       string text;
       cin >> text;
       return text;
    }
    

    und gut ist.



  • So weit waren wir schon lange, deshalb sind wir ja jetzt vom Thema abgekommen. 😃



  • Nö, frostie ist offensichtlich ein Neuling, der std::string nicht kennt. Woher sollte er wissen, das es sich in <string> befindet. Ich bin der erste der es gesagt hat.



  • Also gleich in der zweiten Antwort ist die Rede von std::string.



  • @Helium

    Nö, frostie ist offensichtlich ein Neuling, der std::string nicht kennt.

    Ich bin vielleicht ein Neuling, aber ich weiß was ein string ist und ich wollte eine char (Array) Lösung, falls jemand meinen Text auch gelesen hat.

    Gruß

    Frostie



  • Sinnvolle lösungen sind, das Feld schon reinzugeben oder per Smartpointer ein dynamisch allokiertes zurückzugeben. Statt eines Feldes könnte vielleicht auch std::vector in Frage kommen.

    Feld übergeben:

    char * foo (char (& bar)[9])
    {
       return bar;
    }
    

    @Optimizer:

    Helium schrieb:

    Woher sollte er wissen, das es sich in <string> befindet?

    Also gleich in der zweiten Antwort ist die Rede von std::string.

    😕



  • Helium schrieb:

    Nö, frostie ist offensichtlich ein Neuling, der std::string nicht kennt.

    Optimizer schrieb:

    Also gleich in der zweiten Antwort ist die Rede von std::string.

    Warum sein Compiler das vielleicht nicht kennt (oder was immer er auch gefragt hätte), wär dann schon klar geworden. Egal, jetzt wirds zu pingelig. 🤡


Anmelden zum Antworten