array als Rückgabewert einer Funktion



  • Hi,

    ich möchte gerne mehrere Werte bei einer Funktion zurückgeben und dachte, dass ich dazu ein Array verwenden kann.
    Wenn ich die Funktion jedoch folgendermaßen definiere:

    int array[2](int);

    bekomme ich die Fehlermeldung, dass ich ein Array con Funktionen angelegt hätte.
    Kann mir jemand sagen, wie ich es richtig definieren muß?

    Danke



  • timmy123 schrieb:

    int array[2](int);

    int[] func(int);
    Wenn mich nicht alles täuscht.



  • musst ein Zeiger auf das Array zurückgeben:

    int* func(int);
    

    oder nimm vector<int>.



  • Einen Zeiger zurueckgeben, bringt nichts da das Array, wenn es byVal an die Funktion uebergeben wird schon weg ist wenn man per Pointer drauf zugreift. Deshalb muesste man ja entweder in der Funtkion selbst Speicher allokieren und nen Pointer drauf zurueck geben oder man uebergibt der Funktion einen Pointer auf ein Array aus der aufrufenden Funktion, dann braucht man kein Rueckgabewert.

    void irg(int *pnInt)
    


  • Wer in C++ noch mit nativen Arrays arbeitet hat einen an der Waffel.

    Benutzt doch mal std::vector oder wenn der Container eh immer gleich groß bleibt das boost::array.

    Dann kommt es noch darauf an, ob der Container in der Funktion neu erzeugt wird? Wenn ja, dann bitte verpackt in einem std::auto_ptr zurück geben. Ansonst kann man auch boost::shared_ptr benutzen, wenn es eine Membervariable ist.


  • Mod

    timmy123 schrieb:

    Hi,

    ich möchte gerne mehrere Werte bei einer Funktion zurückgeben und dachte, dass ich dazu ein Array verwenden kann.

    arrays können in C++ nicht per value übergeben werden. eine geläufige möglichkeit ist class oder struct zu verwenden. schau dir aber auch std::pair und boost.tuple an - diese existieren zu diesem zweck.



  • eine geläufige möglichkeit ist class oder struct zu verwenden

    Das ist die Variante, die ich im Allgemeinen bevorzugen würde, da sich damit Bedeutung in der Regel einfacher transportieren lässt.
    Statt in einem Kommentar beschreiben zu müssen, wie die einzelnen Werte des Arrays (oder des pairs/des Tuples) zu interpretieren sind, kann ich eine Klasse/Struktur mit zum Problem passend benannten Methoden/Attributen ausstatten.



  • Oh, dass hört sich alles aber sehr kompliziert an. Das heißt, ihr empfehlt, eine Klasse anzulegen nur weil ich zwei Indizes übergeben möchte. Rechtfertigt das wirklich den Aufwand?
    An Vector habe ich auch schon gedacht, kenne das aber eher als container, in den man Werte einfügt und wieder rausholt. Wenn ich meine beiden Indizes aber ständig erneuere, ist das dann ja auch nicht wirklich schön gelöst... 😢
    Das muß doch irgendwie besser handhabbar sein, oder?



  • Wenn du zwei Werte zurueckgeben willst dann uebergib doch zwei Int-Variablen der Funktion als Referenz, schreib die Werte rein und gut is.
    (Kannst an der Stelle auch die Referenz auf ein Array uebergeben, wobei ich zwei einzelne Int-Werte bevorzuge, weil es nicht so Fehler anfällig ist)

    Ist zwar nicht gerade sonderlich schön aber an manchen Stellen sehr sinnvoll (gerade dann wenn man möglichst wenig mit new arbeiten möchte und gleichzeitig das fleißige Kopieren von Objekten verhindern will).



  • timmy123 schrieb:

    Oh, dass hört sich alles aber sehr kompliziert an. Das heißt, ihr empfehlt, eine Klasse anzulegen nur weil ich zwei Indizes übergeben möchte.

    typedef std::pair<int, int> IndexPair;
    
    IndexPair func() {
       index i1 = komplizierteBerechnung();
       index i2 = ebenfallsKomplizierteBerechnung();
       return IndexPair(i1, i2);
    }
    

    Ist das wirklich so kompliziert?



  • Vielen Dank,

    nein, jetzt nicht mehr! 🙂
    Bin halt noch Anfänger und wenn man dann die Vorschläge
    - Klasse anlegen
    - std::pair
    - boost::array
    -etc. liest, weiß man gar nicht, wo man anfangen soll und was davon jetzt am einfachsten zu realisieren ist für mich.
    Aber ich probiere jetzt das eine oder andere aus.

    Vielen Dank Euch allen.


Anmelden zum Antworten