Dynamische Arraygröße
-
wie geht es denn richtig, kannst du mir den richtigen code geben?
-
Siehe:
Einen Zeiger zum ersten Element des Vektors bekommst du mit &verts[0].
-
aber ich brauche doch einen pointer auf alle elemnte (als array)
-
gamer8o4 schrieb:
aber ich brauche doch einen pointer auf alle elemnte (als array)
Nein, ganz sicher nicht. Das wäre die ungewöhnlichste Bibliothek aller Zeiten. Jetzt kommt wohl der Punkt, an dem man auch als C++-ler mal die Feinheiten von rohen Arrays angucken muss, da man dieses Wissen für die Benutzung von C-Bibliotheken braucht. Dann wirst du sehen, dass der Tipp schon richtig ist.
-
#include <iostream> #include <vector> void schnittstelle(int count, const int* elems) { for (int i=0; i<count; ++i) { std::cout << ' ' << elems[i]; } std::cout << std::endl; } int main() { std::vector<int> vec; vec.push_back(2); vec.push_back(7); vec.push_back(1); vec.push_back(8); vec.push_back(2); vec.push_back(8); vec.push_back(1); vec.push_back(8); vec.push_back(2); vec.push_back(8); schnittstelle(vec.size(),vec.empty() ? 0 : &vec[0]); }Das funktioniert, weil der C++ Standard garantiert, dass die Elemente eines
std::vectors alle direkt hintereinander im Speicher liegen, so, wie es auch bei einem "normalen Array" der Fall ist.
-
Üblicherweise kann man von eine solchen C-Schnittstelle auch erwarten, dass die bei übergabe einer Größe von 0 den Zeiger nicht anfasst.

-
Nein, bei mir waere das nicht ueblich. Darueber hinaus fasst die beispielhafte
schnittstelleden Zeiger auch nicht bei count == 0 an, d.h. ist die Abfragevec.empty()ueberfluessig.
-
Verlesen? Genau das habe ich doch gesagt.

-
Das
emptyist immer notwending, da&vec[0]ansonsten UB erzeugt.
-
Oder einfach .data() verwenden.
-
314159265358979 schrieb:
Üblicherweise kann man von eine solchen C-Schnittstelle auch erwarten, dass die bei übergabe einer Größe von 0 den Zeiger nicht anfasst.

Das erwarte ich ja auch. Das Blöde ist nur, dass ich im empty-Fall den operator[] nicht verwenden darf. Hier ist die Abfrage natürlich überflüssig, da genug Elemente im Vektor sind. Aber ich wollte diese Zeile unabhängig vom Befüllen des Vektors haben, so dass das Programm kein UB hervorruft, wenn man die push_back-Zeilen entfernt.
-
314159265358979 schrieb:
Oder einfach .data() verwenden.
data kenne ich bei vector nicht. Ich dachte, das gäb's nur bei std::string & co.
-
http://stackoverflow.com/questions/6212572/whats-the-status-of-stdvectordata
http://en.cppreference.com/w/cpp/container/vector/dataIn C++11 gibt es .data auch bei vectoren.
-
pyhax schrieb:
In C++11 gibt es .data auch bei vectoren.
Ja, habs auch gerade nochmal nachgeguckt. Aber erst, wie gesagt, ab C++11.