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