2013-10-10 83 views
0

通常C API指針被轉換到要麼arraysout參數在瓦拉綁定:如何綁定延遲的參數?

// C 
void get_user_name (char *buffer, int buffer_length); 
void get_user_count (int *count_ptr); 
// Vala 
public static void get_user_name (uint8[] buffer); 
public static void get_user_count (out int count); 

我現在已經遇到其中指針被用作延遲out參數的情況。

// C 
void bind_buffer (void *buffer, int buffer_length, int *length); 
int fetch (void); 

每次fetch()被調用時,數據被傳輸到bufferlength

在Vala中綁定這樣的API的最佳方式是什麼?

// Vala 
public static void bind_buffer (uint8[] buffer, int *length); 
public static int fetch(); 

我不認爲我可以在這裏使用out int length

此外,我必須確保綁定數據在整個綁定期間仍然可用。我怎樣才能做到這一點?

回答

1

你基本上是對的最後一個例子。 CCode註釋有點偏離(默認情況下,array_length爲true,您不需要包含它,並且array_pos不存在。有array_length_pos,但是實際上並不需要,因爲默認值可以正常工作)。在這種情況下,指針真的是唯一的選擇。

至於確保數據可用,它看起來不像C API給你一種方法來做到這一點。通常情況下,這可以通過轉讓所有權來實現,但這需要C API提供一種在不再需要時自動銷燬/取消數據的方法。您唯一能做的就是儘量確保VAPI使用者意識到他們要求數據在需要時保持活動狀態。

Vala傾向於使用精心設計的C API工作得非常好,但是當使用設計不佳的C API時,並不總是可以創建一個好的Vala API。你唯一真正的選擇是改進C庫或者編寫一個封裝庫(C或Vala),它可以代理對C API的調用,同時提供更爲理智的API。

+0

我刪除了我的問題的CCode屬性,因爲它們在這裏不相關(如您所寫)。 –

+0

API中還有更多瘋狂的東西(比如void *,其他指針取決於類型參數):\ –

+1

您可能想要爲這些泛型使用泛型,或者可能爲每種類型創建一個版本,其默認值爲類型參數。 – nemequ