LuaCインタフェースAPI 3

4359 ワード

LuaCインタフェースAPIインタフェースは比較的多く、主にインタラクションスタックの操作をめぐって行われている.
前言
コードをよく書く人はプロファイルを使うという問題に直面するはずですが、現在流行しているプロファイル方式にはinixmljsonyamlなどがあります.それぞれのプロファイルの方式には特有のデータ構造と解析方式がありますが、、lua実はプロファイルとしても使えます.解析もそれに応じて簡単です.
API
以下、読み出しluaプロファイル関連APIについて説明する
プロファイルの読み込み
int luaL_loadfile (lua_State *L, const char *filename);

役割:ファイルをLuaコードブロックにロードし、コードブロックの名前をfilenameと名付けます.filenameがNULLの場合、標準入力からロードされます.ファイルの最初の行が#で始まる場合は、この行は無視されます.
戻り値:
  • LUA_OK:間違いはありません.
  • LUA_ERRSYNTAX:プリコンパイル中に文法エラーが発生しました.
  • LUA_ERRMEM:メモリ割り当てエラー.
  • LUA_ERRGCMM:運転中_gcメタメソッドでエラーが発生しました.(このエラーは、ゴミ収集器によって発生したコードブロックロードプロセスとは無関係です.)
  • luaコードブロックの実行
    int lua_pcall (lua_State *L, int nargs, int nresults, int msgh);
    

    役割:nargsはスタックに圧入されたパラメータの個数であり、関数が呼び出されるとすべてのパラメータがスタックから出ます.関数の戻り値はスタックに入り、戻り値の個数はnresultsに調整されます.msghが0の場合、スタックの上部に返されるエラーメッセージは、元のエラーメッセージと完全に一致します.そうでなければ、msghはスタック上のエラー処理関数のインデックス位置と見なされます.
    戻り値:
  • LUA_OK(0):成功.
  • LUA_ERRRUN:ランタイムエラー.
  • LUA_ERRMEM:メモリ割り当てエラー.このエラーに対して、Luaはエラー処理関数を呼び出すことはありません.
  • LUA_ERRERR:エラー処理関数の実行中に発生したエラー.
  • LUA_ERRGCMM:運転中_gcメタメソッド時に発生したエラー.(このエラーは呼び出された関数とは無関係です.)
  • 変数の取得
    int lua_getglobal (lua_State *L, const char *name);
    

    役割:グローバル変数nameの値をスタックに圧縮し、その値のタイプを返します.
    データ型の判断
    int lua_isnumber (lua_State *L, int index);
    

    ≪アクション|Actions|emdw≫:指定したインデックスの値が数値であるか、数値に変換可能な文字列である場合は、1を返します.そうでない場合は0を返します.
    データの取得
    lua_Integer lua_tointeger (lua_State *L, int index);
    

    役割:*指定されたインデックスのLua値をシンボル付き整数型lua_に変換Integer. このLua値は整数でなければならないか、整数に変換できる数字や文字列でなければならない.そうでなければlua_tointegerは0を返します.
    類似関数
  • lua_stringtonumber
  • lua_toboolean
  • lua_tolstring
  • lua_tonumber
  • lua_tostring

  • 以上の関数は、比較的理解しやすく、本稿では紹介しないで、必要があれば、自分で関連マニュアルを調べることができます.

    C luaを制御し、luaファイルをプロファイルの例とする
    
    /*
     * gcc test.c -llua -lm -ldl
     */
    
    #include 
    #include 
    #include 
    #include 
    
    
    /*
     *               
     */
    static void stackDump(lua_State* L)
    {
        int i;
        int top = lua_gettop(L);
        for(i = 1; i <= top; ++i)
        {
            int t = lua_type(L, i);
            switch(t)
            {
            case LUA_TSTRING:
                printf("'%s'", lua_tostring(L, i));
                break;
            case LUA_TBOOLEAN:
                printf(lua_toboolean(L, i) ? "true": "false");
                break;
            case LUA_TNUMBER:
                printf("'%g'", lua_tonumber(L, i));
                break;
            default:
                printf("'%s'", lua_typename(L, t));
                break;
            }
            printf("   ");
    
        }
        printf("
    "); } void PrintfLuaType(lua_State* L, int type) { printf("'%s'", lua_typename(L, type)); } int main(int argc, char *argv[]) { lua_State *L = lua_open(); luaL_openlibs(L); // int iRet = luaL_loadfile(L, "config.lua"); if(iRet) { printf("laodfile config.lua fail!!
    "); lua_close(L); return 0; } iRet = lua_pcall(L, 0, 0, 0); if(iRet) { printf("lua_pcall fail!!
    "); lua_close(L); return 0; } lua_getglobal(L, "width"); lua_getglobal(L, "height"); stackDump(L); //width if(!lua_isnumber(L, -2)) { printf("width is not number
    "); lua_close(L); return 0; } //height if(!lua_isnumber(L, -1)) { printf("height is not number
    "); lua_close(L); return 0; } int iHeight = lua_tointeger(L, -2); int iWidth = lua_tointeger(L, -1); printf("Width[%d] Height[%d]
    ", iWidth, iHeight); lua_close(L); return 0; }

    luaファイルは次のとおりです.
    width=55
    height=50
    

    コンパイルの実行結果は次のとおりです.
    '55'   '50'
    Width[50] Height[55]
    

    まとめ
    Cはluaを制御し、luaをプロファイルとするが、本稿では比較的簡単な使用例にすぎず、比較的複雑なプロファイルではデータ構造tableタイプを使用することができるが、後述する.