[C ++ Lua用户数据与Mathfu浮点值混淆

问题描述 投票:1回答:1

我正在尝试使用Lua的Mathfu :: Vector来创建向量,但是当我尝试从堆栈中检索用户数据时遇到了问题。

这是我用来定义用户数据的功能

static int vec4(lua_State *L)
{
  const float x = luaL_checknumber(L, 1);
  const float y = luaL_checknumber(L, 2);
  const float z = luaL_checknumber(L, 3);
  const float w = luaL_checknumber(L, 4);

  mathfu::Vector<float, 4> vec(x, y, z, w);
  *static_cast<mathfu::Vector<float, 4> **>(
      lua_newuserdata(L, sizeof(mathfu::Vector<float, 4> *))) = &vec;
  luaL_setmetatable(L, VECTOR_LIB_NAME);

  return 1;
}

而且我有一个函数,它基于self值和一个参数(均为userdata)获得两个向量的点积。>

static int dotVector(lua_State *L)
{
  mathfu::Vector<float, 4> *vecA = *static_cast<mathfu::Vector<float, 4> **>(luaL_checkudata(L, 1, VECTOR_LIB_NAME));
  mathfu::Vector<float, 4> *vecB = *static_cast<mathfu::Vector<float, 4> **>(luaL_checkudata(L, 2, VECTOR_LIB_NAME));

  LOGI("A: %f, %f, %f", vecA->x, vecA->y, vecA->z);
  LOGI("B: %f, %f, %f", vecB->x, vecB->y, vecB->z);
  float dot = mathfu::Vector<float, 4>::DotProduct(*vecA, *vecB);
  lua_pushnumber(L, dot);

  return 1;
};

来自lua的称呼

local vecA = vec4(1, 2, 3, 4)
local vecB = vec4(5, 6, 7, 8)
vecA:dot(vecB)

但是打印出来的值太疯狂了,就像将坏数据转换为浮点数一样>>

A: -8055257885499399810754615288266752.000000, 0.000000, 0.000000
B: 0.000000, 3746318080.000000, 3573.204346

我已经检查了堆栈,并且前两个元素肯定是UserData,但是我似乎无法更深入地研究用户数据。 C ++中的var包含这些值,但是我对可能导致这种情况的内容不知所措。可以肯定的是,用户数据不是我期望的那样。

我正在尝试使用Lua的Mathfu :: Vector创建向量,但是当我尝试从堆栈中检索用户数据时遇到了一个问题。这是我用来定义用户数据的静态函数...

c++ vector lua
1个回答
0
投票

最终发现这很愚蠢,用&进行引用似乎是获取指向对象的指针的不正确方法。我将向量初始化代码更改为

static int vec4(lua_State *L)
{
  const float x = luaL_checknumber(L, 1);
  const float y = luaL_checknumber(L, 2);
  const float z = luaL_checknumber(L, 3);
  const float w = luaL_checknumber(L, 4);

  *static_cast<mathfu::Vector<float, 4> **>(
      lua_newuserdata(L, sizeof(mathfu::Vector<float, 4> *))) = new mathfu::Vector<float, 4>(x, y, z, w);;
  luaL_setmetatable(L, VECTOR_LIB_NAME);

  return 1;
}
© www.soinside.com 2019 - 2024. All rights reserved.