2015-01-30 3 views
3

현재 C++에서 루아로 함수를 전달하려고합니다. 문제는이 함수가 (int, int, char *, ...)의 매개 변수를 가지고 있다는 것입니다. 나는 Lua를 사용하는 것에 꽤 새로운 것이다.C++ 및 인수와의 Lua 통합 (...) (루아 5.1)

그래서 나는 루아 스택으로부터 모든 인수를 얻었고 관련 (...) 것들을 벡터에 넣었다. 지금 뭐야? 내가 루아 상태로 전달할 경우

void MVC_View::Printw (float x, float y, const char* format, ...) 
{ 
glRasterPos2f(x,y); 
char text[256]; 
va_list ap; 
if(format==NULL) 
    return; 
va_start(ap,format); 
    vsprintf_s(text,format,ap); 
va_end(ap); 

glPushAttrib(GL_LIST_BIT); 
    glListBase(m_base-32); 
    glCallLists(strlen(text),GL_UNSIGNED_BYTE,text); 
glPopAttrib(); 

} 

이것은 :

static int L_PrintDebug(lua_State *state) 
{ 
MVC_View * theView = MVC_View::GetInstance(MVC_Model::GetInstace()); 

int n = lua_gettop(state); 

// check if number of arguments is less than 3 
// then we stop as not enough parameters 
if(n < 3) 
{ 
    std::cout << "Error: printDebug(number,number, char *, ...)" << std::endl; 
    lua_error(state); 
} 

// gets parameter 
int x = lua_tointeger(state, 1); 
int y = lua_tointeger(state, 2); 
char * words = (char*) lua_tostring(state, 3); 

//Get the rest of the arguments. 
std::vector<float> Numbers; 
for(int i = 4;i != n; i++) 
{ 
    if(lua_type(state,i) == LUA_TNUMBER) 
    { 
     float theNumber = lua_tonumber(state,i); 
     Numbers.push_back(theNumber); 
    } 
} 

// call C++ function 
//This is where I'm stuck. 
theView->Printw(x,y,words); 
} 

이것은 PrintW 기능은 다음과 같습니다

문제의 코드입니다. 내가 그렇게으로 루아에서 호출 할 수 있도록 노력하겠습니다
m_theModel->theInterface.Pushfunction("PrintOnScreen",L_PrintDebug); 

,

PrintOnScreen(10, 100, "Camera 2 Pos: %f %f %f", Camx, Camy, Camz) 

또는

PrintOnScreen(10,100, "FPS: %f", fps) 

답변

4

문제는 당신이 버지니아와 함수를 호출 할 필요가있을 것으로 보인다 목록에 있지만 벡터에서 인수를 구성하고 있으며 런타임에 va_list를 생성하는 데 합리적인 방법이 없습니다.

I 좋겠 (조금 더의 사슬처럼 C++의 cout), 인쇄 기능은 임의의 인수 집합을 만드는 순서대로 표시 recomment, 그리고 모두의 va_list 사용에 대해 잊지

당신은이 작업을 수행 할 수 있습니다

인수를 반복하여 인수 유형에 따라 버퍼에 추가합니다. 텍스트와 부동 소수점만을 다루는 경우 이것은 매우 간단합니다.

char text[256]; /* Be careful! Buffer overflow potential for not checking lengths of sprintf and not using snprintf */ 
char *buf = &text[0]; /* start buf at beginning of text */ 
int x = lua_tointeger(state, 1); 
int y = lua_tointeger(state, 2); 
for (int i = 3, i < n; i++) { 
    if (lua_type(state,i) == LUA_TNUMBER) { 
     sprintf(buf, "%f", lua_tonumber(state,i)); 
    } else if (lua_type(state,i) == LUA_TSTRING) { 
     sprintf(buf, "%s", lua_tostring(state,i)); 
    } else { 
     // ERROR SOMEHOW 
    } 
    buf += strlen(buf); /* Move the end of buf for more appending 
} 
/* At this point, we've filled in text by walking through it with our buf pointer, and we have a complete string */ 
glPushAttrib(GL_LIST_BIT); 
glListBase(m_base-32); 
glCallLists(strlen(text),GL_UNSIGNED_BYTE,text); 
glPopAttrib(); 

당신은 다음과 같이 루아에서 호출 할 수 있습니다 : 예 (:이 테스트를하지 않은 주)의 경우

PrintOnScreen(10, 100, "Camera 2 Pos: ", Camx, " ", Camy, " ", Camz) 

또는

PrintOnScreen(10,100,"FPS: ", fps) 

을이 목록과 약간 덜 편리 공백으로 분리해야하는 숫자의 수는 더 적지 만 코드 작성이 쉽습니다.

위의 예제 코드는 테스트되지 않았으므로 하나씩 오류나 기타 버그가있을 수 있습니다. 특히 경계 검사를 추가하고 sprintf 대신 snprintf를 사용해야합니다. 또는 구성에 C++ 문자열을 사용하십시오.

+0

대답을 위해 충분히 닫습니다. 감사합니다. – user2418426