Присвоение значения переменной Chaiscript через объект пользовательского типа приводит к неожиданному поведению

У меня есть необычная проблема с C++ и Chaiscript, надеюсь, кто-нибудь сможет мне с ней помочь, и я постараюсь дать столько информации, сколько нужно.

По сути, вызов функции С++, определенной в С++, через chaiscript, которая возвращает объект Vector2 (объект пользовательского типа), вернет сумасшедшие значения, когда я попытаюсь получить значение непосредственно из переменной-члена Vector2 (x или y). Если я назначу весь Vector2 переменной, она будет работать, как и ожидалось, и доступ к переменным-членам даст мне ожидаемое значение.

Мне удалось воспроизвести проблему с минимальным количеством кода, избавившись от физического движка и всего остального, что я использовал.

Вот код С++:

//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.

Я могу обойти эту проблему, используя «var something = getValue()», а затем обращаясь к «something.x», но было бы полезно понять, почему это происходит и как я могу это исправить.


person Douglas Muratore    schedule 31.10.2014    source источник
comment
Не могли бы вы пояснить свой файл test.chai, пожалуйста? Как бы то ни было, он не может быть выполнен, потому что test не входит в область действия myFunc().   -  person lefticus    schedule 02.11.2014
comment
Упс, извините, я забыл удалить объявление функции, чтобы опубликовать его здесь, его там быть не должно. Я отредактировал его, чтобы уточнить файл.   -  person Douglas Muratore    schedule 03.11.2014


Ответы (1)