2017-08-23 31 views
2

繰り返しフィールドルールの使用方法を理解するのに苦労しています。cでのnanopbを持つメッセージで繰り返しフィールドルールを使用する

Test test = test_init_zero() 

最後に、私はいくつかの値を割り当てたい:私は新しいテストオブジェクトを初期化するよ、今

message Test 
{ 
    repeated float value = 1; 
} 

: には、例えば、これは私の.protoです。例:

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

私はそれらをどのように割り当てることができますか? は

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

みたいで、その後、どのように私は戻ってそれらを読んでいますか?

答えて

2

これは、protoファイル内で繰り返しフィールドをどのように定義するかによって異なります。

nanopb docsによると、あなただけのように固定長の配列を持っているあなたが行ったよう repeatedフィールドを指定し、エンコード/デコードの際に個別に各項目を処理するためのコールバック関数を使用するか、nanopb固有の設定を使用しますか
  1. 任意の型の文字列、バイト、および繰り返しフィールドは、デフォルトでコールバック関数にマップされます。
  2. .protoファイルに特別なオプション(nanopb).max_sizeが指定されている場合、文字列はnullで終了するchar配列にマップされ、バイトはchar配列とサイズフィールドを含む構造体にマップされます。
  3. 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; 
関連する問題