The problem is that if I use main-1 the string value is lost when leaving 
the scope of the attribute_value() function.
Am I doing something wrong?



On Monday, August 19, 2013 7:17:56 PM UTC+2, Ilia Mirkin wrote:
>
> Perhaps I'm dense, but what's the problem? That gdb doesn't print the 
> exact type info that you expected? That could well be the difference 
> between -O2 and -O0... 
>
> On Mon, Aug 19, 2013 at 9:55 AM, Alvaro Aguilera 
> <[email protected] <javascript:>> wrote: 
> > Hello, 
> > 
> > I'm having a strange problem when setting an string value in a protocol 
> > buffer. Keep in mind that my experience in C++ and PB is rather limited. 
> > The .proto file looks more or less like this: 
> > 
> > ---------------------- 
> > package buffers; 
> > 
> > message AttributeValue { 
> > 
> >     enum Type { 
> >         INT64   = 0; 
> >         UINT64  = 1; 
> >         INT32   = 2; 
> >         UINT32  = 3; 
> >         FLOAT   = 4; 
> >         DOUBLE  = 5; 
> >         INVALID = 6; 
> >         STRING  = 7; 
> >     } 
> > 
> >     required   Type type = 1; 
> >     optional   int32 i32 = 2; 
> >     optional   int64 i64 = 3; 
> >     optional uint32 ui32 = 4; 
> >     optional uint64 ui64 = 5; 
> >     optional     float f = 6; 
> >     optional    double d = 7; 
> >     optional  string str = 8; 
> > 
> > } 
> > 
> > ---------------------- 
> > 
> > I also have a function to convert a class "VariableDatatype" into an 
> > AttributeValue buffer. It looks like this: 
> > 
> > void BufferConverter::attribute_value(const VariableDatatype &s_atv, 
> > buffers::AttributeValue &b_atv) 
> > { 
> >     switch(s_atv.type()) { 
> >     case VariableDatatype::Type::STRING: 
> >         b_atv.set_type(buffers::AttributeValue::STRING); 
> >         b_atv.set_str(s_atv.str()); 
> >         break; 
> >     } 
> > } 
> > 
> > 
> > In the main function I try to create a protocol buffer containing the 
> string 
> > stored in VariableDatatype by using the attribute_value() function in 
> the 
> > way shown below: 
> > 
> > main-1() 
> > { 
> >     buffers::AttributeValue *bs = new buffers::AttributeValue(); 
> >     c.attribute_value(ds, *bs); 
> > 
> > } 
> > 
> > This doesn't work. 
> > If I print the value of b_atv inside the attribute_value function using 
> gdb 
> > I get something like: 
> > 
> > gdb print b_atv 
> > 26 = (buffers::AttributeValue &) @0x6496b0: {<google::protobuf::Message> 
> = 
> > {<google::protobuf::MessageLite> = { 
> > 
> > 
> > However, when I print *bs from inside main-1, I get something different: 
> > 
> > gdb print *bs 
> > $36 = {<google::protobuf::Message> = {<google::protobuf::MessageLite> = 
> > {_vptr.MessageLite = 0x642650 <vtable for buffers::AttributeValue+16> 
> > 
> > I can work around the problem by using the following main-2: 
> > 
> > main-2() 
> > { 
> >     buffers::AttributeValue *bs = new buffers::AttributeValue(); 
> >     buffers::AttributeValue &bss = *bs; 
> > 
> >     c.attribute_value(ds, bss); 
> > } 
> > 
> > but that's not very elegant. Can someone point me to the right way to 
> handle 
> > this? 
> > 
> > Thank you 
> > A. 
> > 
> > 
> > 
> > 
> > 
> > -- 
> > You received this message because you are subscribed to the Google 
> Groups 
> > "Protocol Buffers" group. 
> > To unsubscribe from this group and stop receiving emails from it, send 
> an 
> > email to [email protected] <javascript:>. 
> > To post to this group, send email to [email protected]<javascript:>. 
>
> > Visit this group at http://groups.google.com/group/protobuf. 
> > For more options, visit https://groups.google.com/groups/opt_out. 
>

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to