내 C++ 응용 프로그램에 루아를 내장했습니다. 나는 인쇄 된 문장을 리다이렉트하고 싶다. (아니면 단순히 프린트 기능을 다시 정의 할까?) 평가 된 표현식을 다른 곳에 표시 할 수있다.임베디드 루아에 대한 print() 재 지정/재정의
이렇게하는 가장 좋은 방법은 무엇입니까? redirect 또는 print() 함수를 재정의 하시겠습니까?
코드 조각에 대한 모든 스 니펫/포인터는이 작업을 수행하는 방법을 보여줍니다.
내 C++ 응용 프로그램에 루아를 내장했습니다. 나는 인쇄 된 문장을 리다이렉트하고 싶다. (아니면 단순히 프린트 기능을 다시 정의 할까?) 평가 된 표현식을 다른 곳에 표시 할 수있다.임베디드 루아에 대한 print() 재 지정/재정의
이렇게하는 가장 좋은 방법은 무엇입니까? redirect 또는 print() 함수를 재정의 하시겠습니까?
코드 조각에 대한 모든 스 니펫/포인터는이 작업을 수행하는 방법을 보여줍니다.
luaB_print
을 lbaselib.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
). print
및 io.write
은 다시 정의하지 않고 처리합니다.
C 또는 Lua 함수를 작성하고 print
을 재정의하십시오.
단순히 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
당신은 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 '' '를 사용하는 파일
꽤 잘 작동합니다. 고마워요! –
@MikeM. 'luaL_dostring'을 호출하면 필요한 출력을'char *'로 간단히 리턴 할 수있는 방법이 있습니까? – ewok
+1! 정확히 내가 필요로했던 것 @ewok, luaL_dostring은 const char *를 반환하므로 필요한 것을 정확하게 얻을 수 있습니다. –
다음 매크로를 다시 정의 할 수 있습니다.
lua_writestring
lua_writeline
lua_writestringerror
원하는대로 입력하십시오. 이것이 처음 소개 된 lua 버전에 대해서는 잘 모르겠지만 5.3 버전에서 작동합니다.
lauxlib.h 또는 luaconf.h를 확인하십시오.
그건 루아 소스를 직접 수정할 것을 제안하는 것 같습니다. (틀릴 수도 있습니다.)하지만 확실한 방법이 있어야합니까? – skyeagle
글쎄, 나는 루아 소스를 편집하는 것에 대한 특별한 혐오감이 없다. 나는 무엇이든 의미를 바꾸지 않는다. 필자는 파일을 EXE 파일에 리소스로 바인딩 한 Lua "컴파일러"를 작성한 다음 파일 시스템이 아닌 실행 가능 리소스에서 읽기 위해 루아의 파일 루틴을 연결했습니다. 단지 몇 줄의 소스를 변경해야했습니다. 그러한 변화를 피하려고 노력했을 때 어떤 악몽이었을 지 상상할 수 없습니다. – Mud
Mike M이주는 해결책은 루아 코드를 건드리지 않습니다. 사용자 정의 인쇄 기능을 제공하고 Lua C 함수'lua_register (L, "print", my_print)'를 통해 기본 인쇄 기능을 등록하여 무시합니다. –