Используя повторное правило поля в сообщении с nanopb в c

Мне трудно понять, как использовать повторяющееся правило поля. например, это мой.proto:

message Test
{
   repeated float   value = 1;
}

Теперь я инициализирую новый объект Test:

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.

а потом, как мне прочитать их обратно?

1 ответ

Решение

Это зависит от того, как вы определяете повторяющееся поле внутри файла прото. Согласно документации Nanopb, вы либо просто указываете repeated поле, как вы сделали, а затем использовать функцию обратного вызова для обработки каждого элемента отдельно во время кодирования / декодирования, или вы используете настройки, относящиеся к nanopb, чтобы иметь массив фиксированной длины:

  1. Строки, байты и повторяющиеся поля любого типа по умолчанию соответствуют функциям обратного вызова.
  2. Если есть специальная опция (nanopb).max_size указано в .proto файл, строка отображается в массив char с нулевым символом в конце, а байты - в структуру, содержащую массив char и поле размера.
  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, вы бы использовали max_count согласно правилу 4.:

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;
Другие вопросы по тегам