Dynamische Arraygröße
-
#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.