1) Assigning buffer to a std::vector (copy data) Std::vector v(buffer,buffersize);
2) std::vector wrapper (untested) struct Wrapper : public std::vector { Wrapper( double* buffer,size_t size ) { // initialize stl internals with buffer this->_M_impl _M_start = buffer; this->_M_impl _M_finish = this->_M_impl _M_end_of_storage = buffer + size; } ~Wrapper() { // nulls out internals to avoid deallocation from stl this->_M_impl _M_start = this->_M_impl _M_finish = this->_M_impl _M_end_of_storage = NULL; } }; I think boost have already a similar class, but boost is a big hammer for such a tiny nail! -mab From: softimage-boun...@listproc.autodesk.com [mailto:softimage-boun...@listproc.autodesk.com] On Behalf Of Guillaume Laforge Sent: Monday, June 10, 2013 8:53 AM To: softimage@listproc.autodesk.com Subject: Re: [C++] Store a structure of vector in a UserData Hi Ahmidou, I'm often storing just a pointer to an array/buffer/vector to pass any struct to a User Data and it is working fine. It is hard to help you without seeing more chunks of your code :). Maybe you could try to repro the issue on a simpler code that you could share here ? Cheers, Guillaume On Mon, Jun 10, 2013 at 4:33 AM, Ahmidou Lyazidi <ahmidou....@gmail.com<mailto:ahmidou....@gmail.com>> wrote: Thanks everyone, unfortunatly I'm still stuck..... @ Stephane, this is what I'm doing, but it's not working: sizeof( test.A ) + sizeof( double ) * test.A.size() + sizeof( test.B ) + sizeof( double ) * test.B.size() + sizeof( bool ) * 2 @ Guillame Thanks, I tryed your example but I'm probably doing it the wrong way: Foo Test; //Set some values Test.A->pushback(12); Test.B->pushback(24); Test.B->pushback(32); Test.C->pushback(true); Test.D->pushback(false); myMap.PutItemValue( i, (unsigned char*)&Test, sizeof( Foo )) ; // Get them back const unsigned char* pInternalData = NULL ; UINT cntData = 0 ; myMap.GetItemValue( 0, pInternalData, cntData ) ; Foo *pData = (Foo*) pInternalData ; if(pData) { Application().LogMessage("nb "+CString(pData->A->size())); } this return empty vector.... @MAB Could you point me to some ressources on the web about this? Thanks!! ----------------------------------------------- Ahmidou Lyazidi Director | TD | CG artist http://vimeo.com/ahmidou/videos http://www.cappuccino-films.com 2013/6/10 Marc-Andre Belzile <marc-andre.belz...@autodesk.com<mailto:marc-andre.belz...@autodesk.com>> Alternatively, you could store C++ buffers in your struct instead of std::vector objects. Then if you need to access your data with stl, just assign each buffer to an std::vector out from these buffers. If you can't afford the extra copy performed by std::vector constructor, you'll need to implement your own wrapper class deriving from std::vector that nulls out the internal container upon destruction. This is required to avoid std::vector to deallocate your buffer memory. Of course I haven't tested this solution yet but it should work. :) -mab From: softimage-boun...@listproc.autodesk.com<mailto:softimage-boun...@listproc.autodesk.com> [mailto:softimage-boun...@listproc.autodesk.com<mailto:softimage-boun...@listproc.autodesk.com>] On Behalf Of Guillaume Laforge Sent: Sunday, June 09, 2013 3:29 PM To: softimage@listproc.autodesk.com<mailto:softimage@listproc.autodesk.com> Subject: Re: [C++] Store a structure of vector in a UserData Well, if you need the exact number of bytes, you will need to take into account the size of std::vector objects I think :). On Sun, Jun 9, 2013 at 10:07 AM, Stephan Woermann <swoerman...@googlemail.com<mailto:swoerman...@googlemail.com><mailto:swoerman...@googlemail.com<mailto:swoerman...@googlemail.com>>> wrote: To get the total size of the struct, this should work: Foo test; sizeof( double ) * test.A.size() + sizeof( double ) * test.B.size() + sizeof( bool ) * 2 Stephan 2013/6/9 Guillaume Laforge <guillaume.laforge...@gmail.com<mailto:guillaume.laforge...@gmail.com><mailto:guillaume.laforge...@gmail.com<mailto:guillaume.laforge...@gmail.com>>> Hi Ahmidou :), You could try to use pointers to std::vector. This way you will be able to access those vector and get the double values correctly. But you must handle the allocation/deallocation of those vectors by yourself: struct Foo{ std::vector<double> *A; std::vector<double> *B; bool C; bool D; Foo() { A = new std::vector<double>; B = new std::vector<double>; } ~Foo() { delete A; delete B; } }; Hope this help, Guillaume On Sun, Jun 9, 2013 at 8:07 AM, Ahmidou Lyazidi <ahmidou....@gmail.com<mailto:ahmidou....@gmail.com><mailto:ahmidou....@gmail.com<mailto:ahmidou....@gmail.com>>> wrote: Hi List, Is it possible to store this kind of struct in a UserData (map or blob): struct Foo{ std::vector<double> A; std::vector<double> B; bool C; bool D; }; I can pull out the structure, and the vectors have the good number of item...but they are empty, the values are gone I'm not sure, but I think it's lost because of the size parameter in UserDataMap.PutItemValue I tried to set the real size ( sizeof(vector)+ sizeof(double)*vector::size() ) but this gave me some crazy results. Any idea? Thanks ----------------------------------------------- Ahmidou Lyazidi Director | TD | CG artist http://vimeo.com/ahmidou/videos http://www.cappuccino-films.com
<<attachment: winmail.dat>>