在 C++ 中进行 Lua 转储。
2013-7-11 22:49:46
收藏:0
阅读:161
评论:3
我想使用lua_dump或luaU_dump导出一个二进制Chunk。
错误:返回值只有<-LuaR>。
代码没有编译错误或静态问题,只有< -LuaR返回值。
我能做什么来解决这个问题?
private:
const char* buildLua(QString luaScript)
{
const Proto* f;
char *byteCode = 0L;
size_t byteCodeLen = 0;
wdata wd = { &byteCodeLen, &byteCode };
string ts = luaScript.toStdString();
const char* cs;
lua_State *L = luaL_newstate();
f=combine(L,0);
luaL_loadstring(L,ts.c_str());
luaL_openlibs(L);
lua_lock(L);
luaU_dump(L,f,kpt_lua_Writer,&wd,1);
lua_unlock(L);
lua_close(L);
cs = byteCode;
return cs;
}
static const char* kpt_lua_Reader(lua_State *L, void *ud, size_t *size)
{
UNUSED(L);
if ((*(int*)ud)--)
{
*size=sizeof(FUNCTION)-1;
return FUNCTION;
}
else
{
*size=0;
return NULL;
}
}
static int kpt_lua_Writer(lua_State * /*l*/, const void *p, size_t sz, void *ud)
{
wdata *wd = (wdata *)ud;
char *newData;
if((newData = (char *)realloc(*(wd->data), (*(wd->len)) + sz))) {
memcpy(newData + (*(wd->len)), p, sz);
*(wd->data) = newData;
*(wd->len) += sz;
} else {
free(newData);
return 1;
}
return 0;
}
static const Proto* combine(lua_State* L, int n)
{
if (n==1)
return toproto(L,-1);
else
{
Proto* f;
int i=n;
if (lua_load(L,kpt_lua_Reader,&i,"=(keppedev)",NULL)!=LUA_OK) fatal(lua_tostring(L,-1));
f=toproto(L,-1);
for (i=0; i<n; i++)
{
f->p[i]=toproto(L,i-n-1);
if (f->p[i]->sizeupvalues>0) f->p[i]->upvalues[0].instack=0;
}
f->sizelineinfo=0;
return f;
}
}
static void fatal(const char* message)
{
QWidget *widget = new QWidget();
QMessageBox::warning(widget,"Keppe Develop",message);
}
点赞
用户234175
编译器错误是由于frmDevelop :: writer的无效函数原型实现引起的。
extern“C”
{
静态int frmDevelop :: writer(lua_State * L,const void * p,size_t size,void * u)
{
// ...
}
}
在class frmDevelop 的声明点上仅需要static限定符。此外,extern“C”在此处不正确,因为您要告诉编译器不要搅混函数名称。但是,编译器无法遵守该请求,因为您正在使用C ++功能(writer是frmDevelop的一部分,因此您需要::范围运算符)- extern“C”仅被忽略frmDevelop :: writer。
将writer的实现从:
extern“C”
静态int frmDevelop :: writer(lua_State * L,const void * p,size_t size,void * u)
{ /* … */ }
更改为
int frmDevelop :: writer(lua_State * L,const void * p,size_t size,void * u)
{ /* … */ }
这将修复您正在获得的编译错误。
2013-07-11 20:25:41
用户2573350
我正在使用代码修复它
源文件(包含)
void frmDevelop::on_actionBuild_Project_triggered()
{
if (!isInLuaMode) return;
const char* output = buildLua(cedit->document()->toPlainText());
int length = strlen(output);
}
头文件(包含)
private:
const char* buildLua(QString luaScript)
{
string ts = luaScript.toStdString();
lua_State *L = luaL_newstate();
FILE* D = fopen("test.luac","wb");
luaL_openlibs(L);
luaL_loadstring(L,ts.c_str());
lua_lock(L);
int re = lua_dump(L,kpt_lua_Writer,D);
lua_unlock(L);
lua_close(L);
fclose(D);
return QString::number(re).toStdString().c_str();
}
static int kpt_lua_Writer(lua_State * /*l*/, const void *p, size_t sz, void *u)
{
return (fwrite(p,sz,1,(FILE*)u)!=1) && (sz!=0);
}
请务必将test.luac替换为您的文件名:D
2013-07-12 13:51:09
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
没有必要使用 Lua 的内部功能。无论如何,您应该调用
luaL_loadstring或luaL_loadbuffer,而不是luaL_dostring,它会在字符串中_执行_代码:lua_State *L = luaL_newstate(); luaL_loadstring(L,s.c_str()); lua_dump(L,writer,NULL); lua_close(L);但是,您应该测试
luaL_loadstring和lua_dump的返回值。