Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较从Lua中的C函数推送的字符串失败,除非复制到新字符串 我正在研究一个程序,它创建了一个用C和C++混合编写的SDL窗口中的Lua 5.1环境。我已经建立了一个事件系统,对SDL事件进行排队,这样Lua就可以从队列中弹出事件。当键入可打印字符时,将发送其中一个事件。当检测到事件时,它将字符串推入一个新的lua\u状态,在std::queue中对其进行排队,一旦它被拉入lua\u状态中的值就会被复制到主协程状态,然后由coroutine.yield返回。但是,当我将字符串与Lua端的一个常量进行比较时(例如:ev[2]==“q”),比较结果为false。如果我将该值复制到一个新字符串中并对其进行比较(例如:“…ev[2]==“q”),则比较结果为true_C++_C_Lua - Fatal编程技术网

比较从Lua中的C函数推送的字符串失败,除非复制到新字符串 我正在研究一个程序,它创建了一个用C和C++混合编写的SDL窗口中的Lua 5.1环境。我已经建立了一个事件系统,对SDL事件进行排队,这样Lua就可以从队列中弹出事件。当键入可打印字符时,将发送其中一个事件。当检测到事件时,它将字符串推入一个新的lua\u状态,在std::queue中对其进行排队,一旦它被拉入lua\u状态中的值就会被复制到主协程状态,然后由coroutine.yield返回。但是,当我将字符串与Lua端的一个常量进行比较时(例如:ev[2]==“q”),比较结果为false。如果我将该值复制到一个新字符串中并对其进行比较(例如:“…ev[2]==“q”),则比较结果为true

比较从Lua中的C函数推送的字符串失败,除非复制到新字符串 我正在研究一个程序,它创建了一个用C和C++混合编写的SDL窗口中的Lua 5.1环境。我已经建立了一个事件系统,对SDL事件进行排队,这样Lua就可以从队列中弹出事件。当键入可打印字符时,将发送其中一个事件。当检测到事件时,它将字符串推入一个新的lua\u状态,在std::queue中对其进行排队,一旦它被拉入lua\u状态中的值就会被复制到主协程状态,然后由coroutine.yield返回。但是,当我将字符串与Lua端的一个常量进行比较时(例如:ev[2]==“q”),比较结果为false。如果我将该值复制到一个新字符串中并对其进行比较(例如:“…ev[2]==“q”),则比较结果为true,c++,c,lua,C++,C,Lua,我尝试过使用多种方式推送字符串(因为SDL提供UTF-8字符串而不是ASCII字符),包括: lua\u pushstring(L,e.text.text) 插入整个字符串 lua\u pushlstring(L,e.text.text,1) 插入第一个字符 chartmp[2];tmp[0]=e.text.text[0];tmp[1]=0;lua\U推字符串(L,tmp) 复制字符串并插入 但这些都没有解决这个问题 这是我的C++代码中的基本结构: const char*termGetEv

我尝试过使用多种方式推送字符串(因为SDL提供UTF-8字符串而不是ASCII字符),包括:

  • lua\u pushstring(L,e.text.text)

    插入整个字符串
  • lua\u pushlstring(L,e.text.text,1)

    插入第一个字符
  • chartmp[2];tmp[0]=e.text.text[0];tmp[1]=0;lua\U推字符串(L,tmp)

    复制字符串并插入
但这些都没有解决这个问题

这是我的C++代码中的基本结构:

const char*termGetEvent(lua_State*L){
SDL_事件e;
如果(SDL_PollEvent&e)){
如果(e.type==SDL_QUIT)返回“die”;
else if(e.type==SDL\u KEYDOWN&&keymap.find(e.key.keysym.scancode)!=keymap.end()){
lua_pushinteger(L,keymap.at(e.key.keysym.scancode));
lua_pushboolean(L,false);
返回“键”;
}else if(e.type==SDL\u KEYUP&&keymap.find(e.key.keysym.scancode)!=keymap.end()){
lua_pushinteger(L,keymap.at(e.key.keysym.scancode));
返回“向上键”;
}else如果(e.type==SDL_TEXTINPUT){//这是产生错误的部分
char-tmp[2];
tmp[0]=e.text.text[0];
tmp[1]=0;
lua_推进管柱(L,tmp);
返回“char”;
}else if(e.type==SDL_MOUSEBUTTONDOWN){
lua_pushinteger(L,buttonConvert(e.button.button));
lua_pushinteger(L,convertX(e.button.x));
lua_pushinteger(L,convertY(e.button.y));
返回“鼠标点击”;
}else if(e.type==SDL_鼠标按钮){
lua_pushinteger(L,buttonConvert(e.button.button));
lua_pushinteger(L,convertX(e.button.x));
lua_pushinteger(L,convertY(e.button.y));
返回“鼠标向上”;
}else if(e.type==SDL\u鼠标滚轮){
int x=0,y=0;
术语->获取鼠标(&x,&y);
lua_pushinteger(L,e.button.y);
lua_整数(L,x(x));
lua_整数(L,convertY(y));
返回“鼠标滚动”;
}else if(e.type==SDL\u和&e.motion.state){
lua_pushinteger(L,buttonConvert2(e.motion.state));
lua_pushinteger(L,convertX(e.motion.x));
lua_pushinteger(L,convertY(e.motion.y));
返回“鼠标拖动”;
}else if(e.type==SDL\u WINDOWEVENT&&e.window.event==SDL\u WINDOWEVENT\u大小调整){
术语->调整大小();
}
}
返回NULL;
}
std::队列事件队列;
int getNextEvent(lua_State*L,const char*filter){
标准:双电动汽车;
做{
while(eventQueue.size()==0){
lua_State*param=luaL_newstate();
如果(!lua_checkstack(param,4))printf(“无法分配事件\n”);
const char*name=termGetEvent(参数);
if(name!=NULL){
如果(strcmp(名称,“die”)=0)运行=0;
push(std::make_pair(name,param));
}else if(参数){
lua_pushnil(参数);
lua_close(参数);
param=NULL;
}
}
ev=eventQueue.front();
eventQueue.pop();
}而(strlen(filter)>0和strcmp(std::get(ev),filter)!=0);
//复制中的下一个事件
lua_State*param=std::get(ev);
int count=lua_gettop(参数);
如果(!lua_checkstack(L,count+1))printf(“无法分配\n”);
lua_pushstring(L,std::get(ev));
lua_xmove(参数,L,计数);
//lua_close(参数);
返回计数+1;
}
卢厄州*L;
int main(){
int状态、结果、i;
双和;
卢奥州*科罗;
开始:
/*
*所有Lua上下文都保存在这个结构中,我们几乎都使用它
*一直如此。
*/
L=luaL_newstate();
coro=lua_新线程(L);
luaL_openlibs(coro);/*加载Lua库*/
termInit();//初始化SDL
/*加载包含要运行的脚本的文件*/
状态=luaL\u加载文件(coro、bios\u路径);
如果(状态){
/*如果出现错误,错误消息将显示在*/
/*堆栈*/
fprintf(stderr,“无法加载文件:%s\n”,lua_tostring(L,-1));
出口(1);
}
tid=createThread(&termRenderLoop);//运行时停止!=1
/*让Lua运行我们的小脚本*/
状态=LUA_收益率;
int-narg=0;
while(status==LUA\u YIELD&&running==1){
状态=lua_恢复(coro、narg);
如果(状态==LUA\U收益率){
如果(lua_-isstring(coro,-1))narg=getNextEvent(coro,lua_-tstring(coro,-1));
else narg=getNextEvent(coro,“”);
}否则如果(状态!=0){
运行=0;
连接螺纹(tid);
//美国LEEP(5000000);
termClose();
printf(“%s\n”,lua_tostring(coro,-1));
卢厄关闭(L);
出口(1);
}
}
连接螺纹(tid);
termClose();
lua_close(L);/*Cya,lua*/
如果(运行==2){
//美国LEEP(1000000);
转到街