Lua 中栈操作的C API示例

这是《Lua程序设计》中的例子,做个简单记录。

#include <stdio.h>
#include <lua5.2/lua.h>
#include <lua5.2/lauxlib.h>

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("\n");
}

int main(void){

    lua_State *L = luaL_newstate();

    lua_pushboolean(L, 1);
    lua_pushnumber(L, 10);
    lua_pushnil(L);
    lua_pushstring(L, "vonzhou");

    stackDump(L);    // dump the stack

    lua_pushvalue(L, -4);// push the value of the index to the stack
    stackDump(L);

    lua_replace(L, 3);  // pop a value and replace the index's
    stackDump(L);

    lua_settop(L, 6);   // set the top index, fill 'nil'
    stackDump(L);

    lua_remove(L, -3);   //
    stackDump(L);

    lua_settop(L, -5);
    stackDump(L);

    lua_close(L);
    return 0;
}

运行结果:

简单画个示意图:

时间: 2024-10-13 03:24:17

Lua 中栈操作的C API示例的相关文章

lua中栈

首先我们来讲一下栈: lua与c语言通讯的主要方法是通过一个无所不在的虚拟栈.几乎所有的api调用都会操作这个栈上的值:所有的数据交换,无论是lua到c语言或c语言到lua都是通过这个栈来完成.栈可以解决lua与c语言之间存在的两大差异,第一个差异时lua使用垃圾回收收集,而c语言要求显示地释放内存:第二种是lua使用动态类型,而c语言使用静态类型. 我们来看一下c与lua之间是怎么通讯的:(假如c语言想知道lua中的money字符串的值) 1.c想获取lua中的money字符串的值,需要c把m

Lua中C API栈操作

向栈中压入数据: lua_pushnil(lua_State*); lua_pushboolean(lua_State*, bool); lua_pushnumber(lua_State*, lua_Number); lua_pushinteger(lua_State*, lua_Integer) lua_pushlstring(lua_State*, const char*, size_t); lua_pushstring(lua_State*, const char*); 获取栈中元素的类型

C操作Lua虚拟栈的API

Lua是一种嵌入式语言,在C中通过Lua库来执行,Lua和C的通信要通过一个虚拟栈. C的API: 操作栈函数 1 /*压入栈函数 lua_psuhtype*/ 2 void lua_pushnil (lua_State *L); 3 void lua_pushboolean (lua_State *L, int bool); 4 void lua_pushnumber (lua_State *L, lua_Number n); 5 void lua_pushinteger (lua_State

lua中的字符串操作(模式匹配)

模式匹配函数 在string库中功能最强大的函数是: string.find(字符串查找)string.gsub(全局字符串替换)string.gfind(全局字符串查找)string.gmatch(返回查找到字符串的迭代器) 这些函数都是基于模式匹配的.与其他脚本语言不同的是,Lua并不使用POSIX规范的正则表达式[4](也写作regexp)来进行模式匹配.主要的原因出于程序大小方面的考虑:实现一个典型的符合POSIX标准的regexp大概需要4000行代码,这比整个Lua标准库加在一起都大

lua基础【二】lua中关于字符串的操作总结

--从从控制台输入字符串操作 str =io.read() if str=="hello" then print(str) end --lua中的字符串拼接操作 str="hello" str2="world" str3=str..str2 print(str3) --lua中的number与string类型的转换 a=10 b=tostring(a) if b == "10" then print(b) end c=tonu

在堆栈中,push为入栈操作,pop为出栈操作

LinkedList提供以下方法:(ArrayList无此类方法) addFirst(); removeFirst(); addLast(); removeLast(); 在堆栈中,push为入栈操作,pop为出栈操作. Push用addFirst():pop用removeFirst(),实现后进先出. 用isEmpty()--其父类的方法,来判断栈是否为空. 在队列中,put为入队列操作,get为出队列操作. Put用addFirst(),get用removeLast()实现队列. 1 pac

Lua中的Table操作

Lua中table类似与C#种的字典,其实就是一个key-value键值对数据结构.来学习下table基本操作 Table的创建 myTable = {} --表名后面使用{}赋值,表示一个空的表 myTable = {name="海洋",age=18,isMan=true} --创建时候就添加键-值 myTable = {10,20,30,"Ocean"} --创建数字下标值的table,默认是从1开始 Table的赋值 myTable[3] = 34 --当键是

简述C/C++调用lua中实现的自定义函数

1.首先说下目的,为什么要这么做 ? 正式项目中,希望主程序尽量不做修改,于是使用C/C++完成功能的主干(即不需要经常变动的部分)用lua这类轻量级的解释性语言实现一些存在不确定性的功能逻辑:所以,程序功能如有问题,只需对lua脚本作出修改,而修改脚本的好处是简单高效,改完脚本后重新执行程序便能看到效果.  2.具体怎么做? 一般来说,C/C++调用lua接口或是数据交互,首先要做的是包含lua相关操作的头文件以及lua库相关的头文件,然后调用接口创建lua环境.用操作栈的规则和lua交互数据

Lua中的线程和状态

1.概述 线程(thread)作为Lua中一种基本的数据类型,它代表独立的执行线程(independent threads of execution),线程类型是实现协程(coroutines)的基础,注意这里的线程类型不要与操作系统线程混淆,Lua的线程类型是Lua虚拟机实现一种数据类型. 从Lua脚本来看,一个协程就是一个线程类型,比如: local co = coroutine.create(function() print("hi") end) print(co) --outp