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 wievoid 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