سؤال

كيف يمكنني اجتياز طاولة من طول غير معروف من LUA إلى وظيفة C ++ ملزمة؟

أريد أن أكون قادرا على الاتصال بوظيفة LUA مثل هذا:

call_C_Func({1,1,2,3,5,8,13,21})

ونسخ محتويات الجدول إلى صفيف (يفضل أن يكون STL Vector)؟

هل كانت مفيدة؟

المحلول

إذا كنت تستخدم luabind. انها بسيطة كدالة واحدة مسجلة. أما بالنسبة لتدحرج الخاصة بك، فأنت بحاجة إلى إلقاء نظرة على lua_next. وظيفة.

أساسا الرمز هو كما يلي:

lua_pushnil(state); // first key
index = lua_gettop(state);
while ( lua_next(state,index) ) { // traverse keys
  something = lua_tosomething(state,-1); // tonumber for example
  results.push_back(something);
  lua_pop(state,1); // stack restore
}

نصائح أخرى

ستكون هذه محاولتي (بدون فحص الأخطاء):

int lua_test( lua_State *L ) {
    std::vector< int > v;
    const int len = lua_objlen( L, -1 );
    for ( int i = 1; i <= len; ++i ) {
        lua_pushinteger( L, i );
        lua_gettable( L, -2 );
        v.push_back( lua_tointeger( L, -1 ) );
        lua_pop( L, 1 );
    }
    for ( int i = 0; i < len; ++i ) {
        std::cout << v[ i ] << std::endl;
    }
    return 0;
}

يمكنك أيضا استخدام Lua_objlen:

إرجاع "طول" القيمة في الفهرس المقبول المعطى: للحصول على سلاسل، هذا هو طول السلسلة؛ بالنسبة للجداول، فهذه نتيجة لمشغل الطول ('#')؛ بالنسبة إلى UserData، هذا هو حجم كتلة الذاكرة المخصصة ل UserData؛ لقيم أخرى، هو 0.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top