我有以下的C函數。我應該如何包裝它,以便從Lua腳本中調用它?如何包裝一個C函數,其參數是指向結構體的指針,以便它可以從Lua調用?
typedef struct tagT{
int a ;
int b ;
} type_t;
int lib_a_f_4(type_t *t)
{
return t->a * t->b ;
}
我知道如何wrapr,如果函數參數類型爲int
或char *
。我應該使用table
類型爲C結構嗎?
編輯:我使用SWIG的包裝,根據這doc,似乎我應該自動具有此功能new_type_t(2,3)
,但事實並非如此。
如果你打包一個C結構,它也是 映射到一個Lua用戶數據。通過添加一個 metatable到用戶數據,這個 提供了一個非常自然的接口。對於 例如,
struct Point{ int x,y; };
的使用如下:
p=example.new_Point()
p.x=3
p.y=5
print(p.x,p.y) 3 5
類似的訪問提供了一種用於工會 和C++類的數據成員。 C 使用 函數new_Point()創建結構,但對於C++ 類僅使用 名稱Point()創建。
避免痛飲。它造成的問題至少與其造成的問題一樣多,並且手工創建API調用很容易。 – 2010-03-26 17:57:12
@Norman:我需要包裝大量的遺留API,以便我可以從lua調用它,所以自動方式是必須的。你有其他建議嗎? – pierrotlefou 2010-03-29 01:59:24
「多少」是多少?如果它少於100個功能,那麼最好是手動完成。但是如果你想嘗試一種自動化的方法,'tolua'比SWIG稍微不瘋狂。只是輕微。即使'tolua'也增加了很多不必要的重量。 http://www.tecgraf.puc-rio.br/~celes/tolua/ – 2010-03-29 02:02:15