2017-01-07 8 views
0

私はキーとしてuint16を使用し、それをバイトの配列にマップする辞書にG_Variantポインタを返そうとしています(つまり、 "a {qay}")。GLibの配列にマップする辞書を作成するにはどうすればよいですか?

は、ここに私の試みです:

#define KEY 0xDEAD 
    #define BYTE1 0xBE 
    #define BYTE2 0xEF 
    GVariantBuilder *arrBuilder, *builder; 
    GVariant *arr; 

    //build array of bytes ('ay') 
    arrBuilder = g_variant_builder_new(G_VARIANT_TYPE("ay")); 
    g_variant_builder_add(arrBuilder, "y", BYTE1); 
    g_variant_builder_add(arrBuilder, "y", BYTE2); 

    arr = g_variant_new("v",g_variant_new("ay", arrBuilder)); 

    //put it in a dict ('a{sv}') 
    builder = g_variant_builder_new(G_VARIANT_TYPE("a{qay}")); 
    g_variant_builder_add(builder, "{qay}", KEY, arr); 
    return g_variant_builder_end(builder); 

それがうまくいかないと、私はD-バス上でこのプロパティを照会しようとすると、私は、次のエラーメッセージが表示されます。

(process:18319): GLib-CRITICAL **: g_variant_builder_end: assertion 'is_valid_builder (builder)' failed 

(process:18319): GLib-CRITICAL **: g_variant_get_type: assertion 'value != NULL' failed 

(process:18319): GLib-CRITICAL **: g_variant_type_is_array: assertion 'g_variant_type_check (type)' failed 

(process:18319): GLib-CRITICAL **: g_variant_get_type_string: assertion 'value != NULL' failed 

(process:18319): GLib-ERROR **: g_variant_new: expected array GVariantBuilder but the built value has type '(null)' 
Trace/breakpoint trap (core dumped) 

答えて

0
arr = g_variant_new("v",g_variant_new("ay", arrBuilder)); 

たぶん、あなたはbytearrayを返すように配列ビルダーを終了する必要がありますか?

arr = g_variant_builder_end(arrBuilder); 

編集:私は答えを見つけた:

次のコードは、あなたがやりたいことを達成し、トリックは(すべてがバリアントである)バイトの配列が変異型であるということです!

GVariant *arr_builder, *dict_builder; 

/* Build the array of bytes */ 
arr_builder = g_variant_builder_new(G_VARIANT_TYPE("ay")); 
g_variant_builder_add(arr_builder, "y",0xAA); 
// Add some more if you want 
GVariant *byte_array = g_variant_builder_end(arr_builder); 
g_variant_builder_unref(arr_builder); 

/* Build the dictionary, now is the trick */ 
dict_builder = g_variant_builder_new(G_VARIANT_TYPE("a{qv}")); 
g_variant_builder_add(dict_builder, "{qv}", 0x0F0F, byte_array); 
GVariant *dict = g_variant_builder_end(dict_builder); 
g_variant_builder_unref(dict_builder); 

/* Now you can print your variants (dict and byte_array) and print their type */ 
g_print(g_variant_print(dict,TRUE)); 
g_print(g_variant_get_type_string(dict)); 

+0

)=あなたが書いたものをしようとしたとき、私はあなたと同じエラーが発生した、これは作品を作った私はあなたの提案を試してみましたが、私は同じエラーメッセージが表示されます。私も試みた: "arr = g_variant_new(" ay "、g_variant_builder_end(arrBuilder));"同じ結果で同じ行に表示されます。うーん –

関連する問題