char mit return übergeben?



  • Wenn die Länge aus irgendeinem Grund fest ist, kannst du das Array in eine struct verpacken und zurückgeben. Ansonsten einen std::string zurückgeben, aber bitte ohne new, Referenzen und Zeiger:

    std::string funktion()
    {
        return "Hallo Spencer!";
    }
    


  • Hab das jetzt so gemacht, aber,

    char * f(){ 
     char a[9];
    
    cout << "Char eingeben: " << endl;
    cin >> a; 
    
     char * a = new char[9]; 
    
    return a;
    } 
    
    void main(char *a)
    {
    char b[9];
    
    f();
    
    b = *a;
    
    cout << "Char war: " << << b << endl;
    
    return 0;
    }
    

    Warum geht das jetzt nicht.



  • Du definierst in einen a in einem Gültigkeitsbereich zwei mal, übersetzt der das?
    Wenn ja wundert es mich, aber da funktionieren tut das auf keinen Fall.

    Wenn dann so:

    char * f(){
    
     char * a = new char[9];
     cout << "Char eingeben: " << endl;
     cin >> a;
    
     return a;
    }
    

    Aber da mußt du sicherstellen das du nicht mehr als 8 zeichen einliest
    (plus '\0' =9)



  • Und wo wird der Speicher wieder freigegeben ??



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



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



  • So, jetzt hab ich zwar die Adresse in der main, aber wie bekomme ich das array in eine Variable??

    int main(char *c)
    {
    
              char b[9];
    
            cout << &c; //Gibt die Adresse aus!
    
         char b =  *c; // Aber das funktioniert so nicht!!
    
    	return 0;
    }
    


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


Anmelden zum Antworten