Thanks for the example, I'll try tonight!
I also started to mockup a simple version, and surprise, it's working......
I'll keep you informed if I find where the problem is.

Cheers

-----------------------------------------------
Ahmidou Lyazidi
Director | TD | CG artist
http://vimeo.com/ahmidou/videos
http://www.cappuccino-films.com


2013/6/10 Marc-Andre Belzile <[email protected]>

> 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: [email protected] [mailto:
> [email protected]] On Behalf Of Guillaume Laforge
> Sent: Monday, June 10, 2013 8:53 AM
> To: [email protected]
> 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 <[email protected]
> <mailto:[email protected]>> 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 <[email protected]<mailto:
> [email protected]>>
> 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: [email protected]<mailto:
> [email protected]> [mailto:
> [email protected]<mailto:
> [email protected]>] On Behalf Of Guillaume Laforge
> Sent: Sunday, June 09, 2013 3:29 PM
> To: [email protected]<mailto:[email protected]
> >
> 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 <
> [email protected]<mailto:[email protected]><mailto:
> [email protected]<mailto:[email protected]>>> 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 <[email protected]<mailto:
> [email protected]><mailto:[email protected]
> <mailto:[email protected]>>>
> 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 <[email protected]
> <mailto:[email protected]><mailto:[email protected]<mailto:
> [email protected]>>> 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
>
>
>
>
>

Reply via email to