Vektor als Parameter für eine Funktion



  • #include <iostream>
    #include <vector>
    
    using namespace std;
    
    //Funktion zum Erstellen des Vektors.
    vector<int> VektorErstellen();
    vector<int> VektorErstellen()
    {
      vector<int> myvector;
      return myvector;
    }
    
    //Funktion, um einen Wert im Vektor speichern zu können
    //Übergabe erfolgt per Referenz
    void test(vector<int>&myvector,int &a);
    void test(vector<int>&myvector,int &a)
    {
      myvector.push_back (a);
    }
    
    int main()
    {
        int a=0;
        cin>>a;
        test(VektorErstellen(),a);
        return 0;
    }
    

    Wollte ganz gerne eine Funktion, die einen Vektor erstellt, als Parameter für eine andere Funktion verwenden. Leider läßt sich der Code nicht kompilieren.
    Ist eine Funktion als Parameter nicht zulässig oder gibt es da irgendeinen Kniff, wie es doch geht?


  • Mod

    VektorErstellen, so wie du es geschrieben hast, gibt einen temporären Wert zurück. Solche Werte kann man nicht verändern. test, so wie du es geschrieben hast, zeigt an, dass es einen vector<int> möchte und diesen verändern möchte. Das passt nicht zusammen. Was würdest du dir denn vorstellen, wo das a hinterher landet?

    Da dies bloß ein Beispiel ohne Sinn ist, kann man keine geeignete Korrektur vorschlagen.



  • Die Funktion VektorErstellen soll einen Vektor erstellen und ihn zurückgeben(return myvector).

    Die Funktion test soll einen Wert (hier a) in diesem Vektor speichern.

    Wenn ich den Vektor direkt in der main() erstelle und als Parameter übergebe, funktioniert das einwandfrei. Also z.B.:

    int main()
    {
        int a=0;
        cin>>a;
        vector<int> myvector;
        test(myvector,a);
        return 0;
    }
    

    Der Sinn soll darin liegen, per Funktion beliebig einen Vektor erstellen und damit arbeiten zu können.


  • Mod

    Bei deinem nicht funktionierenden Beispiel: Angenommen es würde funktionieren. Und wie würdest du mit dem erstellten und gefüllten Vector weiterarbeiten? Fällt die was auf?



  • SeppJ schrieb:

    Bei deinem nicht funktionierenden Beispiel: Angenommen es würde funktionieren. Und wie würdest du mit dem erstellten und gefüllten Vector weiterarbeiten? Fällt die was auf?

    Man könnte den Vektor zum Beispiel ausgeben oder die Werte in eine Datei schreiben.

    Du willst vermutlich darauf hinaus, daß der Speicherbereich des Vektors, sobald der Gültigkeitsbereich der Funktion verlassen wird, freigegeben wird?
    Wenn man den Vektor nicht mehr braucht, ist das doch sinnvoll, oder nicht?


  • Mod

    redrew99 schrieb:

    SeppJ schrieb:

    Bei deinem nicht funktionierenden Beispiel: Angenommen es würde funktionieren. Und wie würdest du mit dem erstellten und gefüllten Vector weiterarbeiten? Fällt die was auf?

    Man könnte den Vektor zum Beispiel ausgeben oder die Werte in eine Datei schreiben.

    Wie soll das gehen? Mach doch mal vor, wie du dir das vorstellst.

    Du willst vermutlich darauf hinaus, daß der Speicherbereich des Vektors, sobald der Gültigkeitsbereich der Funktion verlassen wird, freigegeben wird?

    Nein. Ich will auf den Unterschied zwischen R-Values und L-Values hinaus. Der Vector aus deiner Funktion wird sowieso kopiert, so wie du es jetzt hast.

    Wenn man den Vektor nicht mehr braucht, ist das doch sinnvoll, oder nicht?

    Was genau soll sinnvoll sein?

    Kann's sein, dass du in deinem Beispielprogramm ein bisschen durcheinander gekommen bist, was eine Referenz sein soll und was nicht?



  • Nein. Ich will auf den Unterschied zwischen R-Values und L-Values hinaus. Der Vector aus deiner Funktion wird sowieso kopiert, so wie du es jetzt hast.

    Ok. Jetzt ist der Groschen gefallen.
    Eine Referenz auf eine Funktion, die einen Wert zurückgibt, ist unlogisch.
    Richtig wäre dann also

    void test(vector<int>myvector,int &a);
    

    Was genau soll sinnvoll sein?

    Naja, wenn ein Vektor nicht mehr benötigt wird, weil der Inhalt z.B. in eine Datei geschrieben wurde, warum soll dann der belegte Speicherbereich nicht freigegeben werden.

    Wie soll das gehen? Mach doch mal vor, wie du dir das vorstellst.

    void test(vector<int>myvector,int &a);
    void test(vector<int>myvector,int &a)
    {
      myvector.push_back (a);
      cout<<myvector[0];           //Hier z.B. Ausgabe des Vektors,alternativ Speicherung in einer Datei.
    }
    

    Kann's sein, dass du in deinem Beispielprogramm ein bisschen durcheinander gekommen bist, was eine Referenz sein soll und was nicht?

    Vermutlich 🙄 . Man verzettelt sich schneller, als man denkt.



  • redrew99 schrieb:

    vector<int>myvector
    

    Ist aber keine Referenz auf eine Funktion, sondern ein normaler vector<int> Parameter, der kopiert wird.

    Eine Referenz auf ein Funktion, die std::vector<int> zurückgibt, sieht so aus:

    std::vector<int> (&foo) ()
    


  • SeppJ schrieb:

    Bei deinem nicht funktionierenden Beispiel: Angenommen es würde funktionieren. Und wie würdest du mit dem erstellten und gefüllten Vector weiterarbeiten? Fällt die was auf?

    LOL. 🙂



  • EOP schrieb:

    SeppJ schrieb:

    Bei deinem nicht funktionierenden Beispiel: Angenommen es würde funktionieren. Und wie würdest du mit dem erstellten und gefüllten Vector weiterarbeiten? Fällt die was auf?

    LOL. 🙂

    314159265358979 schrieb:

    Eine Referenz auf ein Funktion, die std::vector<int> zurückgibt, sieht so aus:

    std::vector<int> (&foo) ()
    

    Bist du dir da sicher? 😉



  • Ja, bin ich.



  • LOL.

    Ok. Jetzt ist der Groschen gefallen.

    So kann man sich täuschen.

    Und wie initialisiere ich dann deinen Prototypen?



  • std::vector<int> foo();
    std::vector<int> (&bar) () = foo;
    


  • So, und jetzt hat der OP evtl. auch noch was gelernt. 🙂

    N schönes Wochenende noch.


Anmelden zum Antworten