我有一個C函數,它需要FILE*
作爲參數,我想在Lua中使用這個函數,傳遞Lua文件。我想我需要一個%typemap
。如何寫它? (我剛開始學習Lua)。Swig和Lua:如何映射Lua文件到FILE *
2
A
回答
5
這是我終於想出的解決方案。
在Lua源代碼中,在liolib.c中,有一個函數FILE *tofile (lua_State *L)
,它將Lua文件轉換爲C FILE *,但它不是API的一部分。我修改了它一下,以便類型表:
%typemap(in) FILE * {
FILE **f;
if (lua_isnil(L, $input))
$1=NULL;
else {
f = (FILE **)luaL_checkudata(L, $input, "FILE*");
if (*f == NULL)
luaL_error(L, "attempt to use a closed file");
$1=*f;
}
}
此類型映射也接受零,因爲我需要一個方式來傳遞NULL給C函數。
0
您正在使用SWIG爲您的C代碼生成Lua綁定?爲什麼不直接使用Lua C API,或者如果您可以使用C++ Luabind?我認爲其中的任何一個都不會比試圖與SWIG合作更好,除非你已經對SWIG有強烈的依戀。
+0
我使用SWIG生成Python綁定,所以我認爲最簡單的方法是重複使用相同的.i文件進行Lua綁定。它的工作正常,除了問題中描述的例外。 感謝您指出其他選項。 – marcin 2009-11-21 21:04:56
0
有沒有簡單的方法來做你想問什麼。
Lua File類接口抽象出底層的實現。你不能簡單地鍵入它。但是,您可以創建一個C代理,它包裝您需要的FILE操作,並使用SWIG在Lua中創建此代理的實例。然後,您可以生成一個類型映射來將FILE *轉換爲包裝代理實例。
喜歡的東西:
class MyFileProxy {
private:
FILE* fp;
public:
MyFileProxy(FILE* fp);
MyFileProxy(const char* path);
FILE* GetFilePointer();
Seek(...
在痛飲綁定很簡單:
%module "MyFile"
%{
#include "MyFileProxy.h"
%}
// Tell SWIG how to use a proxy for functions that take a FILE*
%typemap(in) FILE*
{
void* tmp = 0;
SWIG_ConvertPtr(L,$argnum,(void**)&tmp,$1_descriptor,1);
if (tmp)
{
MyFileProxy* proxy = (MyFileProxy)tmp;
arg$argnum = proxy->GetFilePointer();
}
}
// Tell SWIG how to create a proxy when returning FILE*
%typemap(out) FILE*
{
MyFileProxy* pResult = new MyFileProxy($arg);
SWIG_NewPointerObj(L, pResult, $1_descriptor, 1);
}
%include "MyFileProxy.h
}
您將無法使用IO:但是直接文件。
相關問題
- 1. Lua/SWIG從Lua內包裝userdata
- 2. Lua + SWIG Monkey修補
- 3. 如何直接將Lua變量映射到C++變量?
- 4. 如何從另一個lua文件返回lua文件?
- 5. 如何運行.lua文件?
- 6. 如何從另一個lua文件中加載和執行lua文件
- 7. ,從.lua文件
- 8. SWIG如何從Lua中的c結構使用Lua表來操作
- 9. 從Lua到Lua的Lua嵌套表
- 10. Lua C api:如何加載定義爲模塊的lua文件?
- 11. nodemcu lua dofile - 如何調用另一個lua文件?
- 12. 如何在Lua中創建方法的映射?
- 13. 在SWIG上返回一個lua表
- 14. 如何集成Lua和.Net
- 15. 用SWIG包裝一個Lua對象以在C++中使用SWIG
- 16. 如何在Python到Lua
- 17. 如何在Lua中編寫文件?
- 18. 如何在* .lua文件上使用premake
- 19. 如何在CygWin中執行.lua文件?
- 20. 如何使用lua編輯pcap文件
- 21. 如何用Lua打開wav文件
- 22. 如何在Lua中解析xml文件?
- 23. (SWIG/Lua)如何訪問swig_lua_class中的基類/父類的列表
- 24. 如何通過SWIG在C++中嵌入lua
- 25. 我如何使用Scons來構建SWIG lua示例?
- 26. 的Lua:返回用戶數據到Lua
- 27. SOL2/C++ - Lua初學者,可以在Lua文件之間傳遞Lua表嗎?
- 28. 如何在Luaj中加載Lua-Filesystem和Lua-Penlight
- 29. Lua和C-struct
- 30. Lua和Visual C++
這是一個很好的發現。感謝分享! – 2009-11-30 14:51:01