Невозможно перебрать GVariant с типом массива с помощью итератора

Я пытаюсь вызвать удаленный метод через DBus с помощью GDBus. Моя проблема в том, что вызов метода успешен, но возвращаемое значение из метода, доступного как GVariant, содержит массив в качестве своего элемента. Когда я пытаюсь перебрать его с помощью GVariantIter, это вызывает ошибку сегментации. Но если я распечатываю его на стандартный вывод с помощью g_variant_print (), он успешно печатает данные. Что я делаю неправильно ? Указанная строка формата верна, и я проверил ее, используя g_variant_get_type_string (). Мой фрагмент кода приведен ниже.

        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
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]