2010-12-22 2 views
13

내 C++ 응용 프로그램에 루아를 내장했습니다. 나는 인쇄 된 문장을 리다이렉트하고 싶다. (아니면 단순히 프린트 기능을 다시 정의 할까?) 평가 된 표현식을 다른 곳에 표시 할 수있다.임베디드 루아에 대한 print() 재 지정/재정의

이렇게하는 가장 좋은 방법은 무엇입니까? redirect 또는 print() 함수를 재정의 하시겠습니까?

코드 조각에 대한 모든 스 니펫/포인터는이 작업을 수행하는 방법을 보여줍니다.

답변

4

luaB_printlbaselib.c에서 참조하십시오. 거기에 코멘트가 있습니다 :

/* If you need, you can define your own `print' function, following this 
model but changing `fputs' to put the strings at a proper place (a 
console window or a log file, for instance). */ 

그냥 그 기능을 편집하거나 새 기능을 정의 할 수 있습니다. 이것은 단순하고 이식성이 있다는 장점이 있지만 io.write (걱정할 필요는 없지만)을 처리하지 못합니다.

리디렉션 IO는 플랫폼에 특정되지 않습니다 (예 : Windows의 경우 SetStdHandle). printio.write은 다시 정의하지 않고 처리합니다.

+0

그건 루아 소스를 직접 수정할 것을 제안하는 것 같습니다. (틀릴 수도 있습니다.)하지만 확실한 방법이 있어야합니까? – skyeagle

+0

글쎄, 나는 루아 소스를 편집하는 것에 대한 특별한 혐오감이 없다. 나는 무엇이든 의미를 바꾸지 않는다. 필자는 파일을 EXE 파일에 리소스로 바인딩 한 Lua "컴파일러"를 작성한 다음 파일 시스템이 아닌 실행 가능 리소스에서 읽기 위해 루아의 파일 루틴을 연결했습니다. 단지 몇 줄의 소스를 변경해야했습니다. 그러한 변화를 피하려고 노력했을 때 어떤 악몽이었을 지 상상할 수 없습니다. – Mud

+0

Mike M이주는 해결책은 루아 코드를 건드리지 않습니다. 사용자 정의 인쇄 기능을 제공하고 Lua C 함수'lua_register (L, "print", my_print)'를 통해 기본 인쇄 기능을 등록하여 무시합니다. –

2

C 또는 Lua 함수를 작성하고 print을 재정의하십시오.

10

단순히 Lua 스크립트에서 인쇄를 재정의 할 수 있습니다. 그런 다음

static int l_my_print(lua_State* L) { 
    int nargs = lua_gettop(L); 

    for (int i=1; i <= nargs; i++) { 
     if (lua_isstring(L, i)) { 
      /* Pop the next arg using lua_tostring(L, i) and do your print */ 
     } 
     else { 
     /* Do something with non-strings if you like */ 
     } 
    } 

    return 0; 
} 

를 글로벌 테이블에 등록 :

local oldprint = print 
print = function(...) 
    oldprint("In ur print!"); 
    oldprint(...); 
end 
22

당신은 C에 인쇄 문을 다시 정의 할 수 있습니다

static const struct luaL_Reg printlib [] = { 
    {"print", l_my_print}, 
    {NULL, NULL} /* end of array */ 
}; 

extern int luaopen_luamylib(lua_State *L) 
{ 
    lua_getglobal(L, "_G"); 
    // luaL_register(L, NULL, printlib); // for Lua versions < 5.2 
    luaL_setfuncs(L, printlib, 0); // for Lua versions 5.2 or greater 
    lua_pop(L, 1); 
} 

당신이 포함해야합니다 C++를 사용하고 있기 때문에 당신의 'extern'C '' '를 사용하는 파일

+0

꽤 잘 작동합니다. 고마워요! –

+0

@MikeM. 'luaL_dostring'을 호출하면 필요한 출력을'char *'로 간단히 리턴 할 수있는 방법이 있습니까? – ewok

+0

+1! 정확히 내가 필요로했던 것 @ewok, luaL_dostring은 const char *를 반환하므로 필요한 것을 정확하게 얻을 수 있습니다. –

1

다음 매크로를 다시 정의 할 수 있습니다.

lua_writestring 
lua_writeline 
lua_writestringerror 

원하는대로 입력하십시오. 이것이 처음 소개 된 lua 버전에 대해서는 잘 모르겠지만 5.3 버전에서 작동합니다.

lauxlib.h 또는 luaconf.h를 확인하십시오.

관련 문제