Array als Rückgabewert einer Funktion



  • Moin!
    Kann ein Array kein Rückgabewert (return Array) einer Funktion sein?
    Muss also die Funktion ein Array als Referenz übergeben bekommen, dass dann innerhalb der Funktion gefüllt wird?
    Gibt es auch noch andere Lösungen?

    Danke!
    Daniel



  • Rückgabewert: Schonmal Pointer angesehen? Vorsicht! Der Speicher des zurückgegebenen Arrays muss entweder statisch oder dynamisch sein sonst *bang*. delete nicht vergessen.

    Array übergeben:
    1. Möglichkeit) siehe Pointer
    2. Möglichkeit)

    void Test(int array[], int size){
      // blabla
    }
    


  • vactor<int> CreateAndFillArray()
    {
       vactor<int>  temp;
       temp.push:_back(1);
       temp.push:_back(1);
       return temp;
    }
    
    int main()
    {
      vector <int> myVec(CreateAndFillArray);
      vector<int> myVec2;
      myVec2 = CreateAndFillArray(); // Zu beachten sind hier die Anstehenden Kopein
    
    }
    


  • Yeah, vactor! 😉



  • boost::array ist ein Wrapper für statische Arrays, die man kopieren, zuweisen etc. kann -> http://www.boost.org



  • ..jo danke erstmal!
    -Knuddlbaer, operator void:
    Ich wollte eigentlich keinen Vector (oder dergleiches)verwenden....trotzdem danke!

    -MaSTaH:
    Deine Antwort verstehe ich leider noch nicht ganz.
    Was meinst Du mit Pointer? - Zeiger? Dann wäre doch mein eigener Lösungsvorschlag, Referenzen zu verwenden, doch aber genausogut?!?

    Mir ging es eigentlich vor allem erstmal darum, ob Funktionen nur "einfache" Variablen (im Sinne von: return Variable;), oder aber auch ganze Arrays von Funktionen zurückgegeben werden können....



  • eine funktion kann kein c-array zurückgeben, aber ein array kann auch als zeiger auf das erste element interpretiert werden, d.h. du gibst einfach einen zeiger auf das erste element zurück. was dabei die probleme sind, wurde schon gesagt, ebenso wie der vorzuziehende Weg (boost, vector, etc)



  • Wenn das übergebene Array gleich dem zurückgegebenen ist, ist es ja kein Problem:

    Typ* foo(Typ* Array)
    {
        return(Array);
    }
    

    Da ja in diesem Fall der Aufrufer sowieso Array mit new erstellt hat wird er wohl (hoffentlich) auch nicht auf das delete vergessen - wichtiger: Er erzeugt noch kein Speicherleak indem er den Rückgabewert nicht speichert.

    Schwieriger wird es wenn du in der Funktion den Speicher holst:

    // Weniger gut:
    Typ* foo()
    {
        Typ* Array=new Typ[100];
        return(Array);
    }
    // Wenn er hier den Rückgabewert nicht benützt ist bereits ein Speicherleak entstanden
    

    Deswegen würde ich das Array kapseln beim Zurückgeben (zB: http://www.boost.org/libs/smart_ptr/scoped_array.htm) oder gleich übergeben lassen:

    void foo(Typ* Array, int size)
    {
    }
    

    Bloß ist die Sache gefährlich wenn size zu groß angegeben wurde.

    MfG SideWinder



  • Da ja in diesem Fall der Aufrufer sowieso Array mit new erstellt hat wird er wohl (hoffentlich) auch nicht auf das delete vergessen - wichtiger: Er erzeugt noch kein Speicherleak indem er den Rückgabewert nicht speichert.

    Hä? wieso hat er es mit new erstellt. Er kann es doch auch einfach auf dem Stack erzeugt haben.



  • Helium schrieb:

    Da ja in diesem Fall der Aufrufer sowieso Array mit new erstellt hat wird er wohl (hoffentlich) auch nicht auf das delete vergessen - wichtiger: Er erzeugt noch kein Speicherleak indem er den Rückgabewert nicht speichert.

    Hä? wieso hat er es mit new erstellt. Er kann es doch auch einfach auf dem Stack erzeugt haben.

    Dann kann ja erst recht nichts schief gehen :).

    MfG SideWinder


Anmelden zum Antworten