2011-11-08 31 views
0

我有這段代碼: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); 至 fuseguifs_getattr(「/ home/leon」,* a);

但後來我得到一個錯誤:「無法傳遞價值,引用或輸出 參數」

我已經嘗試添加「走出去」: 解析度= Posix.lstat(路徑,出* stbuf);

這給了這個錯誤: 錯誤:ref和out方法參數只能用領域, 參數,局部變量和數組元素訪問使用

我不能改變fuseguifs_getattr方法的參數,因爲這是 這是保險絲綁定期望的一部分。

我真的被卡住了。有人如何解決這個問題?

回答

0

這似乎解決它:

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

請問這是正確的方式去?

3

我想你想要做這樣的事情:

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

+0

我不能通過刪除我相信的指針來更改函數定義。該方法由fuse定義:http://fuse.sourceforge.net/doxygen/structfuse__operations.html#7a4c5d8eaf7179d819618c0cf3f73724 如果我從函數中的stbuf中刪除指針,我得到這個錯誤: 無法從'fuseguifs_getattr'轉換爲' Fuse.GetAttr':( – Leon

+0

fuse.vapi有一個非常奇怪的編碼方式,它應該可能被改變。下面的方式對VAPI來說是很好的。 – apmasell