2017-08-23 71 views
2

我有一个困难时期。 例如,这是我的.proto:在实现如何使用重复的领域规则中使用重复场规则的消息nanopb在C

message Test 
{ 
    repeated float value = 1; 
} 

现在,我初始化一个新的测试对象:

Test test = test_init_zero() 

最后,我要分配一些值。例如:

float values[] = { 1.0, 2.2, 5.5, 7.13 } 

我的问题是我如何分配它们? 是不是像

test.value = values 
//or 
test.value[0] = values[0] //... etc. 

然后,我怎么读回来呢?

回答

2

这取决于你如何定义原文件中的重复场。据nanopb docs,则要么只是指定repeated字段等你没有,然后使用一个回调函数来编码/解码过程中单独处理每个项目,或使用特定nanopb-设置,以便具有固定长度数组:

  1. 默认情况下,任何类型的字符串,字节和重复字段都映射到回调函数。
  2. 如果在.proto文件中指定一个特殊的选项(nanopb).max_size,串映射到空终止字符数组和字节映射到包含一个字符数组和一个大小字段的结构。
  3. 如果(nanopb).fixed_length设置为true并且(nanopb).max_size也被设置,则字节映射到固定大小的内联字节数组。
  4. 如果有一个重复字段中指定一个特殊的选项(nanopb).max_count,其映射到任何的被重复类型的阵列。将为存储的实际数量创建另一个字段。

例如,字节数组需要使用max_size

required bytes data = 1 [(nanopb).max_size = 40, (nanopb).fixed_length = true]; 

,这将创建下列字段,编译时使用nanopb:

// byte arrays get a special treatment in nanopb 
pb_byte_t data[40]; 

或者,对于float ,你会根据规则4:

使用 max_count
repeated float data = 1 [(nanopb).max_count = 40]; 

然后你会得到:

size_t data_count; 
float data[40]; 

如果你简单地定义一个repeated场像你这样,那么nanopb将创建一个回调函数:

// repeated float value = 1; 
pb_callback_t value; 

这意味着你将不得不提供自己的功能,将处理每个进入的项目:

yourobject.value.arg = &custom_args; 
yourobject.value.funcs.decode = custom_function_for_decoding;