0

C++ と Chaiscript に特有の問題があります。誰かが私を助けてくれることを願っています。必要なだけ多くの情報を提供しようと思います。

基本的に、Vector2 オブジェクト (ユーザー型オブジェクト) を返す chaiscript を介して c++ で定義された c++ 関数を呼び出すと、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 になります。

この問題は、「var something = getValue()」を使用してから「something.x」にアクセスすることで回避できますが、その理由と修正方法を理解しておくと役立ちます。

4

1 に答える 1

1

これは ChaiScript のバグで、developブランチで修正されたばかりで、次のリリースで修正される予定です。

https://github.com/ChaiScript/ChaiScript/commit/4f972bcf67826591423149c006f80d43a026bd15

于 2014-11-04T01:24:13.627 に答える