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

#posix #fuse #vala

#posix #fuse #vala

Вопрос:

У меня есть этот фрагмент кода:

 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);
для
fuseguifs_getattr(«/home/leon», *a);

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

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

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

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

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

Ответ №1:

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

 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 снова при вызове функции.

Комментарии:

1. Я не могу изменить определение функции, удалив указатель, который я считаю. Метод определяется с помощью fuse: fuse.sourceforge.net/doxygen/… Если я удаляю указатель из stbuf в функции, я получаю эту ошибку: не удается преобразовать из fuseguifs_getattr' to Fuse. GetAttr’ 🙁

2. У fuse.vapi действительно странный способ кодирования. Вероятно, это следует изменить. То, как вы сделали это ниже, прекрасно, учитывая VAPI.

Ответ №2:

Кажется, это решает проблему:

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

Это был бы правильный путь?