C++和Lua与参数的集成(..)(路易5.1)
C++ and Lua integration with arguments (...) (Lua 5.1)
我目前正在尝试将函数从C++传递给Lua。问题是这个函数有一个参数 (int, int, char *, ...)。我对使用 Lua 也很陌生。
所以我从lua堆栈中得到了所有的参数,并将相关的(...)参数放入一个向量中。现在怎么办?
这是有问题的代码:
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 函数:
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();
}
这是我将其传递到 Lua 状态的地方。
m_theModel->theInterface.Pushfunction("PrintOnScreen",L_PrintDebug);
我希望能够在Lua中这样称呼它,
PrintOnScreen(10, 100, "Camera 2 Pos: %f %f %f", Camx, Camy, Camz)
或
PrintOnScreen(10,100, "FPS: %f", fps)
问题似乎是您需要调用带有 va 列表的函数,但您正在向量中构造参数,并且没有合理的方法来处理在运行时构造va_list。
我会重新评论让你的打印函数采用任意一组参数,按顺序显示它们(有点像C++的cout
链),而完全忘记使用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();
然后你可以像这样打电话给Lua:
PrintOnScreen(10, 100, "Camera 2 Pos: ", Camx, " ", Camy, " ", Camz)
或
PrintOnScreen(10,100,"FPS: ", fps)
对于需要空格分隔的数字列表,这稍微不那么方便,但我认为更容易编码。
同样,请注意,上面的示例代码未经测试,可能包含逐个错误或其他错误。特别是你应该添加边界检查并使用snprintf而不是sprintf。或者,使用 c++ 字符串流进行构造。
相关文章:
- 将公共但非静态的成员函数与ALGLIB集成
- 数到第n个楼梯的路(顺序无关紧要)
- vscode g++链路故障:体系结构x86_64的未定义符号
- 将IBM Rhapsody模型集成到VS 2019中
- 从R调用C++函数并对其进行集成时出错
- 如何集成 HID USB 控制器?
- 在VS2019项目中集成ImageMagick:x64-windows-static library
- GLFW DDS 加载函数的 OpenGL 链路错误
- 将Qt集成到现有的VS项目中以取代WinAPI
- 易失性sig_atomic_t的内存安全性
- 将 Crashpad 与 Windows Qt 应用程序集成
- C++易失性:保证 32 位访问?
- Python3.6 模板中的 CGAL C++ 集成错误
- 避免易失性和非易失性成员函数的代码重复
- 基本 Cuda C++项目集成问题
- QBS 为静态链路 MSVC 创建静态库
- 如何使用CMake将QtMultimedia组件集成到项目中?
- 当 2 个线程共享同一物理内核时,具有错误共享的易失性增量在发布中的运行速度比在调试中慢
- 如何在C++中创建类型列表的 n 路笛卡尔积?
- C++和Lua与参数的集成(..)(路易5.1)