c/c++_Lua交互----关于Lua中table类型的使用实例

简介: lua中的复合类型 只有table 类型,你可以当做任意容器使用  ,比如 数组    PHP中的关联数组  C++中的 std::map 等等  而且提供了很方便的使用 下面是lua中 table类型的使用 c++加载代码  #include "string.

lua中的复合类型 只有table 类型,你可以当做任意容器使用  ,比如 数组    PHP中的关联数组  C++中的 std::map 等等  而且提供了很方便的使用

下面是lua中 table类型的使用

c++加载代码 

#include "string.h"
extern "C"
{

#include "lualib.h"  //包含lua lib
#include "lauxlib.h"  //辅助函数
};
#pragma  comment(lib,"lua.lib")
//Lua和C程序通过一个堆栈交换数据: lua_State
///定义static 只能在源文件内部使用
static  lua_State* GetLua()
{
    lua_State* lu = luaL_newstate();     /*创建Lua对象*/  
    luaL_openlibs(lu); // 打开所有 共享库函数 到lua 对象
    return lu ;
}
int _tmain(int argc,char*argv[] )
{
    lua_State  *lua=GetLua() ;
    luaL_dofile(lua,"./main1.lua");
    return 0 ;
}



Lua脚本代码

--定义一个table类型 
table1={}
--Lua的table 可以使数组 可以使map 可以使混合类型 这一点和PHP的  array(xx=>xx,1,2)很类似 
--Lua的table 可以存放任何数据  包括函数  
--此处创建的是索引表
for i=1,10,1 do
   table1[i]=i;
end 
---下面是几种遍历表的方式 
---key value迭代方式
print('--------------------------基于索引数组的检索------------------------------');
print("key value 方式迭代集合!")
for key,value in pairs(table1) do
    print(key,":",value)
end 
---根据索引方式
print("索引方式取值!")
for  i=1,#table1,1 do
   print(i,":",table1[i])
end
print("aaaaaaa")
--[[
for i=1,table.maxn(table1) do 
  print(i,":",table1[i])
end 
]]--
--根据ipairs方式取
print("i key value pairs方法")
for k,v in ipairs(table1) do
    print(k,":",v)
end 
--table成员拼接成字符串
print(table.concat(table1,'#'))
print(table.concat(table1,'#',1,5))
print('--------------------------基于索引数组的检索------------------------------');
print("key value 方式迭代集合!")
table1={} --清空表
--创建混合table 
table1=
{
   {['name']='张三',['age']=15,['sex']="male",2},
   {['name']='李四',['age']=15,['sex']="male"},
   {name='王五',['age']=18,['sex']="femal"},
   5,
   test=1
   
}
---根据索引方式
print("索引方式取值!")
for  i=1,#table1,1 do
   if ( type(table1[i]) == "table") then
      print("Index:",i,":",table1[i]['name'],table1[i]['age'],table1[i]['sex'])
   else
      print("Index:",i,":",table1[i],'is not a table!')
   end
end
---根绝key value方式取值 
print("根据key value方式取值")
print(table.concat(table1[2],"#"))
--内部闭包通过 foreach提供函数 来实现
table.foreach(table1,
function(k,v)
  if ( type(v) == "table") then
      print("Index:",k,":",v['name'],v['age'],v['sex'])
   else
      print("Index:",k,":",v,'is not a table!')
   end
end
)
--通过foreachi进行 IndexedBase 迭代 
print('foreachi只能迭代基于索引的table')
table.foreachi(table1,
function(k,v)
  print('Index:',k,':',v)      
end 
)
print('通过for ipairs迭代 只能迭代Indexed Base')
for k,v in ipairs(table1) do
    print("Index:",k,":",v)
end 
print('通过for pairs 迭代 All')
for k,v in pairs(table1) do
    print("Index:",k,":",v)
end 
---返回table中的元素个数 
---只能获取Indexed Base元素的个数 
elementCount=table.getn(table1)
print('element count is',elementCount)
---设置table中元素的个数
---table.setn(table1,2)  已经被废弃 
--print('通过for pairs 迭代 All')
--for k,v in pairs(table1) do
--   print("Index:",k,":",v)
--end 
--clear table 
----定义一个输出table的函数
function ShowTable(tb)
   for  i=1,#tb,1 do
   if ( type(tb[i]) == "table") then
      print("Index:",i,":",tb[i]['name'],table1[i]['age'],tb[i]['sex'])
   else
      print("Index:",i,":",tb[i],'is not a table!')
   end
end
end
function ShowTableAll(tb)
   for k,v in pairs(tb) do
        if ( type(v) == "table") then
           print("Index:",k,":",v['name'],v['age'],v['sex'])
        else
          print("Index:",k,":",v,'is not a table!')
        end
   end 
end
---table的插入
function insertElementFunc()
  print('this is a func element')
end
--插入函数元素 
table.insert(table1,1,insertElementFunc)  
ShowTable(table1)
--调用插入的函数
table1[1]() 
--直接通过扩展添加函数成员  动态类型
table1.func=insertElementFunc ;
table1.func();
----显示所有的table元素
----包括关联元素 以及 索引元素 
ShowTableAll(table1)
--从table中移除元素   
--如果参数Pios没有设置那么默认就是从  尾部删除
--remove只会删除基于索引的 如果要删除关联元素 那么只需设置 nil 
print("删除元素测试:")
table.remove(table1,1) 
table.remove(table1,1) 
table.remove(table1,1) 
table.remove(table1);
--删除关联元素
table1.test=nil
----包括关联元素 以及 索引元素 
ShowTableAll(table1)
--退出脚本


最后界面



目录
相关文章
|
2月前
|
存储 编译器 程序员
C++类型参数化
【10月更文挑战第1天】在 C++ 中,模板是实现类型参数化的主要工具,用于编写能处理多种数据类型的代码。模板分为函数模板和类模板。函数模板以 `template` 关键字定义,允许使用任意类型参数 `T`,并在调用时自动推导具体类型。类模板则定义泛型类,如动态数组,可在实例化时指定具体类型。模板还支持特化,为特定类型提供定制实现。模板在编译时实例化,需放置在头文件中以确保编译器可见。
33 11
|
3月前
|
安全 程序员 C语言
C++(四)类型强转
本文详细介绍了C++中的四种类型强制转换:`static_cast`、`reinterpret_cast`、`const_cast`和`dynamic_cast`。每种转换都有其特定用途和适用场景,如`static_cast`用于相关类型间的显式转换,`reinterpret_cast`用于低层内存布局操作,`const_cast`用于添加或移除`const`限定符,而`dynamic_cast`则用于运行时的类型检查和转换。通过具体示例展示了如何正确使用这四种转换操作符,帮助开发者更好地理解和掌握C++中的类型转换机制。
|
4月前
|
C++
使用 QML 类型系统注册 C++ 类型
使用 QML 类型系统注册 C++ 类型
62 0
|
5月前
|
编译器 C++ 运维
开发与运维函数问题之函数的返回类型如何解决
开发与运维函数问题之函数的返回类型如何解决
38 6
|
5月前
|
安全 编译器 C++
C++一分钟之-模板元编程实例:类型 traits
【7月更文挑战第15天】C++的模板元编程利用编译时计算提升性能,类型traits是其中的关键,用于查询和修改类型信息。文章探讨了如何使用和避免过度复杂化、误用模板特化及依赖特定编译器的问题。示例展示了`is_same`类型trait的实现,用于检查类型相等。通过`add_pointer`和`remove_reference`等traits,可以构建更复杂的类型转换逻辑。类型traits增强了代码效率和安全性,是深入C++编程的必备工具。
82 12
|
4月前
|
存储 C++
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
44 0
|
5月前
|
C++
C++一分钟之-类型别名与using声明
【7月更文挑战第20天】在C++中,类型别名和`using`声明提升代码清晰度与管理。类型别名简化复杂类型,如`using ComplexType = std::vector<std::shared_ptr<int>>;`,需注意命名清晰与适度使用。`using`声明引入命名空间成员,避免`using namespace std;`全局污染,宜局部与具体引入,如`using math::pi;`。恰当应用增强代码质量,规避常见陷阱。
82 5
|
4月前
|
设计模式 安全 IDE
C++从静态类型到单例模式
C++从静态类型到单例模式
38 0
|
5月前
|
编译器 C++
C++从遗忘到入门问题之C++中的浮点数类型问题如何解决
C++从遗忘到入门问题之C++中的浮点数类型问题如何解决
|
5月前
|
C++ 开发者
C++一分钟之-概念(concepts):C++20的类型约束
【7月更文挑战第6天】C++20引入了Concepts,提升模板编程的精确性和可读性。概念允许设定模板参数的编译时约束。常见问题包括过度约束、不完整约束及重载决议复杂性。要避免这些问题,需适度约束、全面覆盖约束条件并理解重载决议。示例展示了如何定义和使用`Incrementable`概念约束函数模板。概念是C++模板编程的强大力量,但也需谨慎使用以优化效率和代码质量。
107 0