我对C ++和Chaiscript有一个特殊的问题,希望有人可以帮我解决这个问题, 我会尝试尽可能多地提供信息。
基本上,当我尝试直接从Vector2的成员变量(x或y)获取值时,调用c ++中通过chaiscript定义的c ++函数(返回Vector2对象(用户类型对象))将返回疯狂值。 如果我将整个Vector2分配给一个变量,它将按预期工作,访问成员变量将给我预期的值。
我设法用尽可能少的代码重现问题,摆脱物理引擎和我正在使用的其他一切。
这是c ++代码:
//test.cpp
#include <chaiscript/chaiscript.hpp>
#include <chaiscript/chaiscript_stdlib.hpp>
template<typename T>
struct Vector2
{
Vector2() : x(0), y(0) {};
Vector2(T px, T py) : x(px), y(py) {};
Vector2(const Vector2& cp) : x(cp.x), y(cp.y) {};
Vector2& operator+=(const Vector2& vec_r)
{
x += vec_r.x;
y += vec_r.y;
return *this;
}
Vector2 operator+(const Vector2& vec_r)
{
return Vector2(*this += vec_r);
}
void operator=(const Vector2& ver_r)
{
x = ver_r.x;
y = ver_r.y;
}
T x;
T y;
};
Vector2<float> GetValue()
{
return Vector2<float>(10,15);
}
int main()
{
chaiscript::ChaiScript _script(chaiscript::Std_Lib::library());
//Registering stuff
_script.add(chaiscript::user_type<Vector2<float>>(), "Vector2f");
_script.add(chaiscript::constructor<Vector2<float> ()>(), "Vector2f");
_script.add(chaiscript::constructor<Vector2<float> (float, float)>(), "Vector2f");
_script.add(chaiscript::constructor<Vector2<float> (const Vector2<float>&)>(), "Vector2f");
_script.add(chaiscript::fun(&Vector2<float>::x), "x");
_script.add(chaiscript::fun(&Vector2<float>::y), "y");
_script.add(chaiscript::fun(&Vector2<float>::operator +), "+");
_script.add(chaiscript::fun(&Vector2<float>::operator +=), "+=");
_script.add(chaiscript::fun(&Vector2<float>::operator =), "=");
_script.add(chaiscript::fun(&GetValue), "getValue");
_script.eval_file("test.chai");
return 0;
}
以下是剧本:
//test.chai
var test = 0.0
var test2 = Vector2f(10,10)
test = getValue().x
print(test)
print(test2.x)
此代码将重现以下内容: 6.52556e-38 10
每次运行代码时,getValue()。x(6.52556e-38)中的这个值实际上是不同的,但它通常是1.f~8.f之间的一些疯狂值,它会变为指数-36~ -38
我可以通过使用&#34; var something = getValue()&#34;然后访问&#34; something.x&#34;来解决这个问题,但是理解为什么会发生这种情况会有所帮助以及如何解决这个问题。
答案 0 :(得分:1)
这是ChaiScript中的一个错误,它已在develop
分支上修复,并将在下一个版本中修复。
https://github.com/ChaiScript/ChaiScript/commit/4f972bcf67826591423149c006f80d43a026bd15