2016-10-07 8 views
2

内部のgetGlobal私はLuaの-C-APIを理解しようとしています。このために、グローバル変数を取得し、その引数を出力し、2つの戻り値をプッシュする単純なコールバックを作成しました。実行したいLuaコードをtest.luaとして保存しました。しかし、実際の出力これは私がいじりのための明確な兆候であるのLua:コールバック

global var = 3.140000 
arg 1 = 3.14 
arg 2 = Lua 5.2 
arg 3 = 134 
123.456 Hello 

であることは、非常に簡単であり、

var = 134 
local n,s = callback(3.14, _VERSION) 
print(n,s) 

を読み込み期待される出力

global var = 134.000000 
arg 1 = 3.14 
arg 2 = Lua 5.2 
123.456 Hello 

だろう私は理解していない方法でスタックを持っています。以下は私のコンパイル可能なCコードの例です。

gcc -Wall -Wextra -pedantic -std=c99 test.c -llua 

使用をコンパイルするとLuaは

./a.out test.lua 

を使用してtest.luaファイルの例を実行するには、あなたは私がスタック権利を得るのを助けることはできますか?


#include <lua.h> 
#include <lualib.h> 
#include <lauxlib.h> 
#include <stdio.h> 
#include <math.h> 

static int l_callback(lua_State* L) 
{ 
    lua_getglobal(L, "var"); 
    double var = NAN; 
    if (lua_isnumber(L, 1)) 
    var = lua_tonumber(L, 1); 
    printf("global var = %f\n", var); 

    int args = lua_gettop(L); 
    for (int n = 1; n <= args; ++n) 
    printf("arg %d = %s\n", n, lua_tostring(L, n)); 
    lua_pushnumber(L, 123.456); 
    lua_pushstring(L, "Hello"); 

    return 2; 
} 

int main(int argc, char** argv) 
{ 
    if (argc <= 1) 
    { 
    fprintf(stderr, "Usage: %s <lua file>\n", argv[0]); 
    return 1; 
    } 

    lua_State *L = luaL_newstate(); 
    luaL_openlibs(L); 

    lua_register(L, "callback", l_callback); 

    if (luaL_dofile(L, argv[1]) != LUA_OK) 
    { 
    const char* message = lua_tostring(L, -1); 
    puts(message); 
    lua_pop(L, 1); 
    } 

    lua_close(L); 
} 

答えて

2

3.14_VERSIONまだそのインデックスは3なりますvarためlua_getglobalを呼び出して、スタックにプッシュされています。

あなたはスタックにプッシュされ、最後のvar値の値をポップするために付与するために、変位インデックスを使用してコードを調整することができます。

lua_getglobal(L, "var"); 
    double var = NAN; 
    if (lua_isnumber(L, -1)) 
    var = lua_tonumber(L, -1); 
    printf("global var = %f\n", var); 
+1

は、あなたの答えをいただき、ありがとうございます。スタック上に変位指数を使用できるかどうかは分かりませんでした。また、この部分の後には 'lua_pop(L、1);'が必要です。さもなければ、グローバル 'var'はスタックにとどまり、引数としてカウントされます。 –