LINUX.ORG.RU

Можно ли в Vala объявить simple class как переменную, а не как указатель?

 ,


0

1

Никак не могу правильно обернуть функцию в vapi. Функция из libmpv/client.h:

int mpv_get_property(mpv_handle *ctx, const char *name, mpv_format format, void *data);

Для базовых типов, работает

//mpv.vapi
[CCode (cname = "mpv_get_property", simple_generics = true, has_target = false)]
public Mpv.Error get_property_double (string name, Mpv.Format format, out double data);

//code
double pos;
Mpv.Error = er;
er = ctx.get_property_double ("time-pos", Mpv.Format.DOUBLE, out pos);

генерирует правильный код на C:

gdouble pos = 0.0;
enum mpv_error er;
er = mpv_get_property (self->priv->ctx, "time-pos", MPV_FORMAT_DOUBLE, &pos);

А для структуры не работает:

//vapi
[Compact]
[CCode (cname = "struct mpv_node")]
public class Node {
///////
}

[CCode (cname = "mpv_get_property", simple_generics = true, has_target = false)]
public Mpv.Error get_property_node (string name, Mpv.Format format, out Mpv.Node data);

//code
Mpv.Node node;
Mpv.Error = er;
er = ctx.get_property_node ("metadata", Mpv.Format.NODE, out node);

Проблема в том, что Vala генерирует в С переменную структуры как указатель:

struct mpv_node* node = NULL;
enum mpv_error er;
er = mpv_get_property (self->priv->ctx, "metadata", MPV_FORMAT_NODE, &node);
Т.е. должно быть объявление структуры как переменной mpv_node node; и передача адреса в функцию , а не адреса указателя mpv_node* node = NULL;

Как можно решить этот вопрос?

★★

Как всегда, стоило написать и сразу пришло решение. Надо объявлять не как класс, а как struct:

[Compact]
[CCode (cname = "struct mpv_node")]
public struct Node {
///////
}
тогда объявление Mpv.Node node; генерируется в C как struct mpv_node node = {0};

nvl ★★ ()
Последнее исправление: nvl (всего исправлений: 1)
Ответ на: комментарий от AUX

Какой профит от вала

Простой и понятный синтаксис, прямо одно удовольствие. Пишется легко и просто. То, что не могу осилить на C, на Vala пишется на раз.

и какие перспективы на рынке труда?

Не ко мне вопрос.

nvl ★★ ()