ошибка vala Posix.lstat()

У меня есть этот кусок кода:

using Posix;

int fuseguifs_getattr(string path, Posix.Stat *stbuf)
{
    int res;
    res = Posix.lstat(path, stbuf);
    if (res == -1)
        return -Posix.errno;

    return 0;
}

static int main(string [] args)
{
    Posix.Stat *a;
    fuseguifs_getattr("/home/leon", a);
    return 0;
}

Когда я пытаюсь скомпилировать его, я получаю эту ошибку:

test.vala:6.26-6.30: error: Argument 2: Cannot convert from
`Posix.Stat' to `Posix.Stat*'
    res = Posix.lstat(path, stbuf);
                            ^^^^^
Compilation failed: 1 error(s), 0 warning(s)

Я пытался изменить это: fuseguifs_getattr("/home/leon", a); to fuseguifs_getattr("/home/leon", *a);

Но затем я получаю сообщение об ошибке: «Невозможно передать значение для ссылки или выходного параметра».

Я пытался добавить «out»: res = Posix.lstat(path, out *stbuf);

Это дает эту ошибку: ошибка: аргументы метода ref и out могут использоваться только с полями, параметрами, локальными переменными и доступом к элементам массива

Я не могу изменить параметры метода fuseguifs_getattr, потому что это часть того, как этого ожидают привязки fuse.

Я действительно застрял. Кто-нибудь, как я могу это решить?


person Leon    schedule 08.11.2011    source источник


Ответы (2)


Я думаю, вы хотите сделать что-то вроде этого:

int fuseguifs_getattr(string path, out Posix.Stat stbuf) {
   int res;
   res = Posix.lstat(path, out stbuf);
   if (res == -1)
      return -Posix.errno;
   return 0;
 }

static int main(string [] args)
{
    Posix.Stat a;
    fuseguifs_getattr("/home/leon", out a);
    return 0;
}

Posix.Stat — это структура, которую будет заполнять lstat. Вместо того, чтобы передавать указатель на эту структуру, Vala ожидает, что вы укажете, что она будет использоваться в качестве вывода lstat, используя ключевое слово out, которое, как и ключевое слово ref, должно быть указано как при объявлении, так и при использовании. Таким образом, для любых определений функций, которые являются out, вы должны снова указать out при вызове функции.

person apmasell    schedule 08.11.2011
comment
Я не могу изменить определение функции, удалив указатель, который я считаю. Метод определяется предохранителем: fuse.sourceforge.net/doxygen/ Я удаляю указатель из stbuf в функции, я получаю эту ошибку: Cannot convert from fuseguifs_getattr' to Fuse.GetAttr' :( - person Leon; 09.11.2011
comment
У fuse.vapi действительно странный способ кодирования. Вероятно, его следует изменить. То, как вы это сделали ниже, отлично подходит для VAPI. - person apmasell; 10.11.2011

Это, кажется, решает это:

int fuseguifs_getattr(string path, Posix.Stat *stbuf)
{
    int res;
    Posix.Stat a;
    res = Posix.lstat(path, stbuf);

    if (res == -1) {
        return -Posix.errno;
    }
    *stbuf = a;

    return 0;
}

Будет ли это правильным путем?

person Leon    schedule 09.11.2011