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