vector an funktion übergeben



  • Hallo zusammen,

    Da akari ja immer predigt 🙂 das man bei dynamischen fällen besser einen vector als ein array nimmt hab ich mir das ganze mal zur Brust genommen und mal ein bischen damit experimentiert.

    wenn ich jetzt einen float vector anlege und den einer funktion übergebe, meckert der compiler immer über Konvertierungsprobleme.

    also ich hab eine funktion die einen float zeiger will und dem will ich anstatt ein array halt den vector geben.

    std::vector<float> wert;
    
    [...]   //<-- Vector füllen
    
    funktion(wert);    //Prototyp  void funktion(float *wert);
    

    wie muss ich vorgehen, damit das so funktioniert. gehen wir mal davon aus das ich die funktion nicht ändern kann.

    Danke



  • Hallo

    Das sinnvollste wäre aber die Funktion selber zu ändern...

    Du kannst den Inhalt des vectors in ein Array casten

    function(&(wert[0]));
    

    Aber du darfst dann in der Funktion ausschließend lesend auf das Array zugreifen!

    bis bald
    akari



  • Danke, das hat soweit funktioniert. find zwar ein bischen blöd das man nicht schreiben drauf zugreifen kann, aber das wird wohl seinen sinn haben.

    jetzt wirds etwas komplizierter.

    ich hab jetzt ein matrix als wector angelegt, und möchte ihn so übergeben das ich schreiben drauf zu greifen kann.

    //anlegen des Vectors
        std::vector<std::vector<float> > test:
    
    //funktionsaufruf
        funktion(&test);
    
    //Diese Funktion
    
    void funktion(std::vector<std::vector<float> > *test2)
    {
        test2[0][0] = 10.0; //Das funktionert irgenwei nicht so
    }
    

    Ich denk mal das ich mal wieder mit der ganzen zeigerei durcheinander komme.
    wie muss denn das richtig aussehen?



  • Hallo

    Du müßtest test2 in funktion erstmal dereferenzieren, da es ein Zeiger ist.

    (*test2)[0][0] = 10.0;
    

    Oder du verwendest einfach Referenzen, dann sieht das besser aus

    //anlegen des Vectors
        std::vector<std::vector<float> > test:
    
    //funktionsaufruf
        funktion(test); // Kein Adressoperator
    
    //Diese Funktion
    
    void funktion(std::vector<std::vector<float> > &test2) // Referenz anstelle Zeiger
    {
        test2[0][0] = 10.0; // Jetzt geht das
    }
    

    bis bald
    akari



  • Danke
    darauf wär ich echt nicht gekommen.

    nur wegen der vollständigkeit!

    std::vector<std::vector<float> > wert;
    
    funktion(&(wert[0][0]));    //Prototyp  void funktion(float **wert);
    

    das wäre jetzt mein vorschlag, aber das funzt mal wieder nicht richtig.



  • Hallo

    Geschachtelte vector-Container können nicht in mehrdimensionale C-Arrays gecastet werden, da sich das Speicherlayout unterscheidet. In dem Fall must du dich zwischen vector und Array entscheiden bzw. manuell mittels Schleifen und manuelle Speicherverwaltung mit new[] konvertieren.

    bis bald
    akari



  • akari schrieb:

    Das sinnvollste wäre aber die Funktion selber zu ändern...

    Nicht unbedingt. Warum den Benutzer unnötigerweise immer zu einem std::vector zwingen?
    Gleiches gilt für Funktionen, die Strings entgegennehmen: besser const char* als std::string, und wenn der Komfort unbedingt gewollt wird, eine inline-Überladung für std::string bereitstellen.

    akari schrieb:

    Aber du darfst dann in der Funktion ausschließend lesend auf das Array zugreifen!

    Sicher? In allen Implementationen, die mir bisher begegneten, sowie dem zufolge ist das möglich und wohldefiniert.



  • Hallo

    audacia schrieb:

    akari schrieb:

    Aber du darfst dann in der Funktion ausschließend lesend auf das Array zugreifen!

    Sicher? In allen Implementationen, die mir bisher begegneten, sowie dem zufolge ist das möglich und wohldefiniert.

    Gut auf die Elemente des vectors/Arrays kann man wohl auch schreibend zugreifen, aber auf keinen Fall sollte man die Anzahl der Elemente verändern. D.h. so ein C-Array Casting darf man nicht machen wenn die Funktion das Array mit neuen Elementen füllen soll.

    bis bald
    akari



  • akari schrieb:

    D.h. so ein C-Array Casting darf man nicht machen wenn die Funktion das Array mit neuen Elementen füllen soll.

    Auch das geht. Wo man unter C manuell Speicher mit malloc() allozierte, muß man in C++ eben zuvor std::vector::resize() benutzen.
    Oder meinst du so obskure Dinge wie

    void createFloatArray (float** ptrptr);
    

    ? So etwas läßt sich freilich nicht mit std::vector benutzen.



  • Hallo

    audacia schrieb:

    Oder meinst du so obskure Dinge wie

    void createFloatArray (float** ptrptr);
    

    ? So etwas läßt sich freilich nicht mit std::vector benutzen.

    Genau. oder addtoFloatArray(...).
    Ist mir schon klar das du weißt das das ungültig ist, ich wollts nur für andere nicht so erfahrene Mitleser klarstellen 😉

    bis bald
    akari


Anmelden zum Antworten