来自 C++ 的 Angelscript 传输数组
Angelscript transfer array from C++
我需要将一组图块从 C++ 传输到 Angelscript,我尝试添加一个 returns 和 std::vector 的函数,但 returns 这个错误
Failed in call to function 'RegisterGlobalFunction' with 'array<DumbTile> GetTilesAt(int x, int y)' (Code: asINVALID_DECLARATION, -10)
我的代码:
std::vector<DumbTile> GetTilesAt(int x, int y) {
std::vector<DumbTile> output;
for (DumbTile t : tiles) {
if (t.x == x && t.y == y) {
output.push_back(t);
}
}
return output;
}
engine->RegisterGlobalFunction("array<DumbTile> GetTilesAt(int x, int y)", asFUNCTIONPR(GetTilesAt, (int, int), std::vector<DumbTile>), asCALL_CDECL);
是否DumbTile
在GetTilesAt()
注册之前注册了?
是否array<T>
在GetTilesAt()
注册之前注册了?
两者都需要先注册,然后才能注册您的函数。
您使用的是库存数组实现 (sdk/add_on/scriptarray/
) 还是您自己的基于 std::vector<>
的实现?使用股票插件时,应用程序必须首先将 std::vector
转换为 CScriptArray
,因为由于数组的工作方式,angelscript 不能真正独立完成此操作。
有明显的替代方案 - 在您希望脚本访问数据的任何地方从使用 std::vector
切换到 CScriptArray
,但这可能很烦人。
示例std::vector<Object*> <-> CScriptArray*
转换
template<typename Type>
void AppendVectorToArrayRef( vector<Type>& vec, CScriptArray* arr )
{
if( !vec.empty() && arr )
{
uint i = (uint)arr->GetSize();
arr->Resize( (asUINT)(i + (uint)vec.size() ) );
for( uint k = 0, l = (uint)vec.size(); k < l; k++, i++ )
{
Type* p = (Type*)arr->At( i );
*p = vec[k];
(*p)->AddRef();
}
}
}
template<typename Type>
void AssignScriptArrayInVector( vector<Type>& vec, CScriptArray* arr )
{
if( arr )
{
uint count = (uint)arr->GetSize();
if( count )
{
vec.resize( count );
for( uint i = 0; i < count; i++ )
{
Type* p = (Type*)arr->At( i );
vec[i] = *p;
}
}
}
}
代码有点旧,但我认为它应该仍然有效,即使它需要一些刷新。
我需要将一组图块从 C++ 传输到 Angelscript,我尝试添加一个 returns 和 std::vector 的函数,但 returns 这个错误
Failed in call to function 'RegisterGlobalFunction' with 'array<DumbTile> GetTilesAt(int x, int y)' (Code: asINVALID_DECLARATION, -10)
我的代码:
std::vector<DumbTile> GetTilesAt(int x, int y) {
std::vector<DumbTile> output;
for (DumbTile t : tiles) {
if (t.x == x && t.y == y) {
output.push_back(t);
}
}
return output;
}
engine->RegisterGlobalFunction("array<DumbTile> GetTilesAt(int x, int y)", asFUNCTIONPR(GetTilesAt, (int, int), std::vector<DumbTile>), asCALL_CDECL);
是否DumbTile
在GetTilesAt()
注册之前注册了?
是否array<T>
在GetTilesAt()
注册之前注册了?
两者都需要先注册,然后才能注册您的函数。
您使用的是库存数组实现 (sdk/add_on/scriptarray/
) 还是您自己的基于 std::vector<>
的实现?使用股票插件时,应用程序必须首先将 std::vector
转换为 CScriptArray
,因为由于数组的工作方式,angelscript 不能真正独立完成此操作。
有明显的替代方案 - 在您希望脚本访问数据的任何地方从使用 std::vector
切换到 CScriptArray
,但这可能很烦人。
示例std::vector<Object*> <-> CScriptArray*
转换
template<typename Type>
void AppendVectorToArrayRef( vector<Type>& vec, CScriptArray* arr )
{
if( !vec.empty() && arr )
{
uint i = (uint)arr->GetSize();
arr->Resize( (asUINT)(i + (uint)vec.size() ) );
for( uint k = 0, l = (uint)vec.size(); k < l; k++, i++ )
{
Type* p = (Type*)arr->At( i );
*p = vec[k];
(*p)->AddRef();
}
}
}
template<typename Type>
void AssignScriptArrayInVector( vector<Type>& vec, CScriptArray* arr )
{
if( arr )
{
uint count = (uint)arr->GetSize();
if( count )
{
vec.resize( count );
for( uint i = 0; i < count; i++ )
{
Type* p = (Type*)arr->At( i );
vec[i] = *p;
}
}
}
}
代码有点旧,但我认为它应该仍然有效,即使它需要一些刷新。