无法使用迭代器迭代具有数组类型的 GVariant

Posted

技术标签:

【中文标题】无法使用迭代器迭代具有数组类型的 GVariant【英文标题】:Unable to iterate a GVariant with array type using iterator 【发布时间】:2016-05-09 23:22:45 【问题描述】:

我正在尝试使用 GDBus 通过 DBus 调用远程方法。我的问题是方法调用成功,但是作为 GVariant 可用的方法的返回值包含一个数组作为其元素。当我尝试使用 GVariantIter 迭代它时,它会导致分段错误。但是,如果我使用 g_variant_print() 将它打印到标准输出,它会成功打印数据。我究竟做错了什么 ?指定的格式字符串是正确的,我已经使用 g_variant_get_type_string() 对其进行了检查。我的代码 sn-p 如下所示。

        GVariantIter* iter;
        gint16 res, mts, vlm;
        guint16 sid;
        char * sname ;
        GVariant* avail ;
        guint16 clsid;
        GVariant* retvalue = g_dbus_proxy_call_sync (proxy, 
                                    "Method", 
                                    "", //no parameters
                                    G_DBUS_CALL_FLAGS_NONE, 
                                    -1, 
                                    NULL, 
                                    &error 
                                  );

        g_variant_get(retvalue, "(na(qs(nn)nnq))",&res, &iter);
        while ( g_variant_iter_loop (iter, "(qs(nn)nnq)", &sid, &sname, &avail, &mts, &vlm,  &clsid) )
        
            // Operate on the variables
        

【问题讨论】:

【参考方案1】:

g_dbus_proxy_call_sync() 如果我没记错的话,会在一个元组中返回你的 GVariant。您需要做的是在创建迭代器之前打开元组。

在调用 g_dbus_proxy_call_sync 后尝试执行此操作:

GVariantIter *iter;
GVariant *temp;

temp = g_variant_get_child_value (retvalue, 0);

iter = g_variant_iter_new (temp);

while (g_variant_iter_loop (iter, "(qs(nn)nnq)", &sid,
  &sname, &avail, &mts, &vlm,  &clsid)) 

  //operate

【讨论】:

以上是关于无法使用迭代器迭代具有数组类型的 GVariant的主要内容,如果未能解决你的问题,请参考以下文章

具有复杂值类型的迭代器:与value_type和引用混淆

ES6中的迭代器(Iterator)和生成器(Generator)

技术点:迭代器失效的几种情况

C++:使用迭代器构造一个二维动态分配的数组

C++ 的STL中,迭代器那个指针为何++能指向下一个元素?

练笔-字符串,向量和数组6