我需要将一个瓷砖数组从C++传输到Angelscript,我已经尝试添加一个函数,它返回一个std::向量,但是它返回这个错误。
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); 发布于 2020-07-12 12:00:21
DumbTile在GetTilesAt()注册之前注册了吗?
array<T>在GetTilesAt()注册之前注册了吗?
这两个都需要注册,然后才能注册您的功能。
您是在使用库存数组实现(sdk/add_on/scriptarray/)还是您自己的std::vector<>-based实现?当使用股票加注时,应用程序必须首先将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;
}
}
}
}代码有点老了,但我认为它应该仍然有效,即使它要求进行一些刷新。
https://stackoverflow.com/questions/62845421
复制相似问题