was heißt vector fehler?
-
Hallo zusammen,
weils so schön ist, gleich noch was von mir. Ich habe folgende member variablen:
MM.h//stores for each provided handle the related index within //the storing area int handle_store[DSM_MM_MAX_STORING_AREAS]; //stores for each TSA the actual read index //only used in case of a read operation int tsa_index[DSM_MM_MAX_STORING_AREAS]; //simulates the FLASH temporary storing area, used to save reveived //result set for a certain period of time //the maximum number of a resultset is: //max number of select vars + max number of select aggs (2 values) and //three meta variables (id, geo, ts) std::vector<int[DSM_RS_MAX_SIZE]> tsa[DSM_MM_MAX_STORING_AREAS];/** * This method stores a resultset entry within a TSA. It simulates a * temporary FLASH storage. * * @param vals the values to store * @param length the length of the vals array * @param handle the handle to the storing area * the storage */ void MemoryManager::storeInTSA(int* vals, int length, int handle) { int index = handle_store[handle]; int cookie[DSM_RS_MAX_SIZE]; //copy the resulset entry memcpy(&cookie[0], vals, length); vector<int[DSM_RS_MAX_SIZE]>* v = &tsa[index]; v->push_back(cookie); }//End storeUnd bekomme bei der v->push_back(cookie) Zeile folgende Fehlermeldung, welche mir leider komplett unverständlich ist:
/Application/tinyDSM/dsmql/mm' /usr/bin/g++34 -c -O2 -DNDEBUG=1 -DWITH_PARSIM -DWITH_NETBUILDER -g -I. -I../../../../../helpStructures -I../ -I../ast -I../mm -I~/omnetpp/include memorymanager.cc /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_construct.h: In function `void std::_Construct(_T1*, const _T2&) [with _T1 = int[15], _T2 = int[15]]': /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_vector.h:560: instantiated from `void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = int[15], _Alloc = std::allocator<int[15]>]' memorymanager.cc:744: instantiated from here /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_construct.h:81: Fehler: ISO-C++ verbietet Initialisierung eines Feldes mit »new« /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/vector.tcc: In member function `void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename _Alloc::pointer, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp = int[15], _Alloc = std::allocator<int[15]>]': /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_vector.h:564: instantiated from `void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = int[15], _Alloc = std::allocator<int[15]>]' memorymanager.cc:744: instantiated from here /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/vector.tcc:234: Fehler: ungültige Initialisierung /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_vector.h:564: instantiated from `void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = int[15], _Alloc = std::allocator<int[15]>]' memorymanager.cc:744: instantiated from here /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/vector.tcc:238: Fehler: ISO C++ forbids assignment of arrays /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_algobase.h: In function `_BidirectionalIterator std::__copy_backward(_RandomAccessIterator, _RandomAccessIterator, _BidirectionalIterator, std::random_access_iterator_tag) [with _RandomAccessIterator = int (*)[15], _BidirectionalIterator = int (*)[15]]': /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_algobase.h:396: instantiated from `static _BidirectionalIterator2 std::__copy_backward_dispatch<_BidirectionalIterator1, _BidirectionalIterator2, _BoolType>::copy(_BidirectionalIterator1, _BidirectionalIterator1, _BidirectionalIterator2) [with _BidirectionalIterator1 = int (*)[15], _BidirectionalIterator2 = int (*)[15], _BoolType = __false_type]' /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_algobase.h:429: instantiated from `_BI2 std::__copy_backward_aux(_BI1, _BI1, _BI2) [with _BI1 = int (*)[15], _BI2 = int (*)[15]]' /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_algobase.h:439: instantiated from `_BI2 std::__copy_backward_output_normal_iterator(_BI1, _BI1, _BI2, __true_type) [with _BI1 = int (*)[15], _BI2 = __gnu_cxx::__normal_iterator<int (*)[15], std::vector<int[15], std::allocator<int[15]> > >]' /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_algobase.h:453: instantiated from `_BI2 std::__copy_backward_input_normal_iterator(_BI1, _BI1, _BI2, __true_type) [with _BI1 = __gnu_cxx::__normal_iterator<int (*)[15], std::vector<int[15], std::allocator<int[15]> > >, _BI2 = __gnu_cxx::__normal_iterator<int (*)[15], std::vector<int[15], std::allocator<int[15]> > >]' /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_algobase.h:498: instantiated from `_BI2 std::copy_backward(_BI1, _BI1, _BI2) [with _BI1 = __gnu_cxx::__normal_iterator<int (*)[15], std::vector<int[15], std::allocator<int[15]> > >, _BI2 = __gnu_cxx::__normal_iterator<int (*)[15], std::vector<int[15], std::allocator<int[15]> > >]' /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/vector.tcc:235: instantiated from `void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename _Alloc::pointer, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp = int[15], _Alloc = std::allocator<int[15]>]' /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_vector.h:564: instantiated from `void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = int[15], _Alloc = std::allocator<int[15]>]' memorymanager.cc:744: instantiated from here /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_algobase.h:380: Fehler: ISO C++ forbids assignment of arrays gmake[8]: *** [memorymanager.o] Fehler 1Und was soll mir das sagen? Ich will einfach den cookie dem Vektor an der stelle tsa[index] anfügen. Kompliert, irgendwie. Mh.
Uwe
-
Ich behaupte das folgendes dein Problem ist:
std::vector<int[DSM_RS_MAX_SIZE]>Ich sage nur C-Arrays... Besser das Array durch einen std::vector (Oder falls TR1 bei deinen Compiler schon verfügbar ist std::tr1::array aus <array.h>).
-
Mh,
tr1 darf ich nicht verwenden, da nicht standard. eigentlich wollte ich mir die umkopiererei einfach machen, da ich ein c-array bekomme. auch soll ich einen pointer auf ein c-array zurückgeben, wenn dann die jeweiligen elemente im tsa ausgelesen werden. mh.
uwe
-
Tja, da hast du aber das grosse Problem, dass man ein C Array nicht über den
operator =kopieren kann. Boost darfst du wohl auch nicht benutzen? Alsoboost::array?
Dann nimm halt wirklich einenstd::vectoroder bau dir schnell selber einstd::tr1::array, abschauen kannst du bei Boost, bzw. so schwer ist es ja nicht
Grüssli
-
TR1 _ist_ Standard. Nur eben nicht verpflichtend, um sich ISO-konform nennen zu dürfen.
Davon abgesehen würde ein std::vector<std::vector<int> > Deine Semantik nicht unbedingt zerstören, da man bei vector auch einen Zeiger auf einen zusammenhängenden Speicherbereich (also ein Array) bekommt, und zwar über die Adresse des ersten Elements. Musst nur drauf achten, dass der innere Vektor immer groß genug ist.
int index = handle_store[handle]; // initialize vector and copy values vector<int> cookie(vals, vals + length); // resize vector to max. size, in case length < max. size cookie.resize(DSM_RS_MAX_SIZE); tsa[index].push_back(cookie); // oder, um Kopien zu vermeiden: tsa[index].push_back(vector<int>()); tsa[index].assign(vals, vals + length); tsa[index].resize(DSM_RS_MAX_SIZE); // Und hier bekommst Du nen Zeiger auf das Array: int* vals = &tsa[index][0];
-
LordJaxom schrieb:
...Musst nur drauf achten, dass der innere Vektor immer groß genug ist....
... was ja bei Arrays auch so ist.

Also keine echte Einschränkung.Gruß,
Simon2.
-
Hallo zusammen,
das ist natürlich schon genial. Da merkt man, wer sich auskennt

Leider habe ich noch ein Problem, was ich nicht ganz verstehe:
Fehler: no matching function for call to `std::vector<int, std::allocator<int> >::push_back(std::vector<int, std::allocator<int> >&)' /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_vector.h:557: Anmerkung: Kandidaten sind: void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = int, _Alloc = std::allocator<int>]Dies betrifft die Stelle:
int index = handle_store[handle]; // initialize vector and copy values vector<int> cookie(vals, vals + length); // resize vector to max. size, in case length < max. size cookie.resize(DSM_RS_MAX_SIZE); //store tsa[index].push_back(cookie); // <-------- fehlerEs heißt ja soviel wie die Typen passen nicht, oder? Ich habe tsa als:
std::vector<std::vector<int> > tsa;also ein Vektor mit Int-Vektoren. Warum geht das nicht
?Uwe
-
Simon2 schrieb:
... was ja bei Arrays auch so ist.

Also keine echte Einschränkung.Naja, ein int[BLA_MAX_SIZE] wäre schon automatisch groß genug. Natürlich nur theoretisch, da das so ja nicht möglich ist.

-
Hallo zusammen,
ich habe es jetzt so zum fliegen bekommen:
std::vector<int> tsa[DSM_MM_TSA_MAX];void MemoryManager::storeInTSA(int* vals, int length, int handle) { int index = handle_store[handle]; // initialize vector and copy values vector<int> cookie(vals, vals + length); // resize vector to max. size, in case length < max. size cookie.resize(DSM_RS_MAX_SIZE); //store tsa[index]= cookie; }//End storeIst das ok so, oder haben die Profis noch Verbesserungsvorschläge?
Danke für Eure tolle Hilfe.Uwe
-
uwerothfeld schrieb:
Ist das ok so, oder haben die Profis noch Verbesserungsvorschläge?
Ja. Lass die zig redundanten Kommentare weg. Die Prämisse "kommentiere viel und ausführlich" ist veraltet und kommt aus den zeiten, wo variabelnnamen nur eine bestimmte Länge haben durften. Benenne lieber deine Variablen so, dass man schon aus dem Code leicht erkennen kann was passiert.
Beispiel:// resize vector to max. size, in case length < max. size cookie.resize(DSM_RS_MAX_SIZE);das ist genau das was resize tut, nicht nötig es nochmal drüber zu schreiben.
Zu viele überflüssige Kommentare sind eher eine Quelle der späteren Fehlinformation: In einem schnellen Bugfix wird mal eben die Zeile geändert, nicht aber der Kommentar. Das Resultat ist dass der Kommentar fortan Lügen über den Code beinhaltet.
-
Hallo,
ist ja völliger Blödsinn, den ich da gemacht habe. Also wieder zurück dass ganze. Ich habe also wieder:
std::vector< std::vector<int> >tsa;und
int index = handle_store[handle]; // initialize vector and copy values vector<int> cookie(vals, vals + length); cookie.resize(DSM_RS_MAX_SIZE); //store tsa[index].push_back(cookie); //<-- fehlerFehler: no matching function for call to `std::vector<int, std::allocator<int> >::push_back(std::vector<int, std::allocator<int> >&)' /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_vector.h:557: Anmerkung: Kandidaten sind: void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = int, _Alloc = std::allocator<int>] gmake[8]: *** [memorymanager.o] Fehler 1Überall wo ich google, klappt das aber so??? Jemand nen Tip? Bin am Durchdrehen.
Uwe
-
Verzichte auf den vector und arbeite mit dem int-Array
-
tsa ist ein ein vector<vector<int> >, damit ist tsa[i] ein vector<int>. Einem vector von int kann man ints hinzufügen, Du versuchst aber, ihm einen vector hinzuzufügen.
Hast Du da im Kopf eine Dimension zu viel?
-
Hallo zusammen,
ich hatte nicht ne Dimension zu viel, sondern zu wenig!!! Ich wollte je handle ein vector, n int-arrays enthält, welches ich ja durch einen vector ersetzen. von daher:
std::vector< std::vector< std::vector<int> > >tsa;Damit klappts! Vielen Dank für Eure HIlfe. Ihr ward wieder Gold wert.
Ich bin sehr begeistert.

Uwe
-
uwerothfeld schrieb:
ich hatte nicht ne Dimension zu viel, sondern zu wenig!!! Ich wollte je handle ein vector, n int-arrays enthält, welches ich ja durch einen vector ersetzen. von daher
Ich glaube aber, wenn ich mir deinen Anfangscode ansehe, das du vielleicht hiermit besser bedient wärst:
// Key: Handle std::map<int, std::vector< std::vector<int> > >Damit du direkt über das Handle die passende Liste bekommst...