У меня есть особая проблема с C ++ и Chaiscript, надеюсь, кто-нибудь может помочь мне с этим, и
Я постараюсь дать ему столько информации, сколько нужно.
По сути, вызов функции c ++, определенной в c ++, через chaiscript, который возвращает объект Vector2 (объект пользовательского типа), будет возвращать ненормальные значения, когда я пытаюсь получить значение непосредственно из переменной-члена Vector2 (x или y).
Если я назначу весь 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.
Я могу обойти эту проблему, используя «varthing = getValue ()», а затем получая доступ к «нечто.x», но было бы полезно понять, почему это происходит и как я могу это исправить.
Это ошибка в ChaiScript, которая только что была исправлена на develop
ветка и будет в следующем выпуске.
https://github.com/ChaiScript/ChaiScript/commit/4f972bcf67826591423149c006f80d43a026bd15