2013-08-25 3 views
3

Я пытаюсь изучить Lua, и я, кажется, застрял здесь.Что здесь делает lua_pcall?

По какой-то причине следующий код фактически не запускает файл lua.

int main() 
{ 
    lua_State* L = luaL_newstate(); 
    luaL_openlibs(L); 

    int width = 0; 
    int height = 0; 

    if(!luaL_loadfile(L, "./src/luaconf.lua") || !lua_pcall(L, 0, 0, 0)) 
    { 
      lua_getglobal(L, "width"); 
      lua_getglobal(L, "height"); 

      if(!lua_isnumber(L, -2)) 
      { 
        luaL_error(L, "width isn't a number"); 
      } 
      else 
      { 
        width = lua_tointeger(L, -2); 
      } 

      if(!lua_isnumber(L, -1)) 
      { 
        luaL_error(L, "height isn't a number"); 
      } 
      else 
      { 
        height = lua_tointeger(L, -1); 
      } 
    } 

    printf("%i x %i", width, height); 

    return 0; 

} 

Я знаю, что если я изменю if(!luaL_loadfile(L, "./src/luaconf.lua") || !lua_pcall(L, 0, 0, 0) к if(luaL_dofile(L, "./src/luaconf.lua")) он будет работать, но я хочу знать, почему этот код не работает.

Не следует ли lua_pcall запускать код lua? Если нет, то почему?

luaconf.lua

width = 500 
height = 40 
+0

Я только что заметил, у вас есть разные «если заявление» в документе и в коде, мой ответ основан на коде. Если это не так, прокомментируйте мой ответ. –

+0

Да, извините. Незначительная ошибка. Код правильный и спасибо за ответ: D – benbot

ответ

3

Обратите внимание, что в коде:

if(!luaL_loadfile(L, "./src/luaconf.lua") || !lua_pcall(L, 0, 0, 0)) 

luaL_loadfile если успешно, она возвращает LUA_OK, который имеет значение 0, так что левый операнд вычисляется как ||1 , согласно короткому замыканию, lua_pcall не будет выполнен.

Так что вы хотите, вероятно:

if ((luaL_loadfile(L, "./src/luaconf.lua") || lua_pcall(L, 0, 0, 0)) 
{ 
    //error handle 
} 
else 
{ 
    //normal handle 
} 
+0

Если это тот случай, то не будет использовать '&&' вместо '||' предпочтительнее? – benbot

+1

@thecodetinker Если вы решите отрицать каждое выражение с помощью '!', Тогда да, вы должны использовать '&&' вместо этого. –

Смежные вопросы