2015-01-18 5 views
3

루아에서 변수를 파싱하면, 루아는 이상하게 행동합니다.잘못된 메모리 위치에있는 루아 인수

C++ :

int LuaManager::SetTimer(lua_State *pLua) 
{ 
    if (!lua_isstring(pLua, 0)) throw "expected: string"; 
    if (!lua_isnumber(pLua, 1)) throw "expected: number"; 

    std::string callback = lua_tostring(pLua, 0); 
    double delay = lua_tonumber(pLua, 1); 
    Timer timer = Timer(callback, delay); 

    return 0; 
} 

루아 :

SetTimer("Durp", 10); 

내가 얻을 "0x76C44598에서 첫 번째 예외를 : 마이크로 소프트 C++ 예외 : 메모리 위치 0x00D7F588에서 문자"라인에서

std::string callback = lua_tostring(pLua, 0); 

예외를 팝업 할 때 코드를 디버그하고 계속 누르면 예외가 발생합니다. 변수. double delay도 마찬가지입니다. 그러나

내가 말할 때 :

std::string callback = lua_tostring(pLua, -2); 
double delay = lua_tonumber(pLua, -1); 

그것은 여전히 ​​예외를 제공하지만 올바른 변수에 던져 내 기억에서

+0

예외가 발생하면 변수에 유효한 값이 포함되지 않습니다. –

+5

0은 절대로 유효한 스택 슬롯이 아닙니다. 첫 번째 스택 슬롯은 1입니다. –

+0

오, 당신은 내 바보 같은 완전 바보입니다. -1과 -2도 올바른 값을 반환하는 이유에 대한 아이디어는 있습니까? – R4VANG3R

답변

1

, 라인

std::string callback = lua_tostring(pLua, 0); 

해야한다.
std::string callback = lua_tostring(pLua, 1); 

lua의 인덱스가 1부터 시작하기 때문에.