Discuz! Board

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 5813|回复: 2
打印 上一主题 下一主题

语法高亮lua测试

[复制链接]

6

主题

15

帖子

163

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
163
跳转到指定楼层
楼主
发表于 2015-7-6 01:52:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[Lua] 纯文本查看 复制代码
function FileSaveLoad()
      local file = io.open("c:\\in.lua", "r");
      assert(file);
      local data = file:read("*a"); -- 读取所有内容
      file:close();
      file = io.open("c:\\out.lua", "w");
      assert(file);
      file:write(data);
      file:close();
end
FileSaveLoad();

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

6

主题

15

帖子

163

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
163
沙发
 楼主| 发表于 2015-7-6 02:05:25 | 只看该作者
[Lua] 纯文本查看 复制代码
// lua.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <assert.h>

//lua头文件
extern "C"   //在c++中调用C库
{
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
};

#define TOSTRING(P) #P  //转成字符串

#define err_exit(num,fmt,args)  /
	do{printf("[%s:%d]"fmt"/n",__FILE__,__LINE__,##args);exit(num);} while(0)
#define err_return(num,fmt,args)  /
	do{printf("[%s:%d]"fmt"/n",__FILE__,__LINE__,##args);return(num);} while(0)

//#define exampleNum(n) num##n
//int num9=9;
//int num=exampleNum(9); //将会扩展成 int num=num9;

//lua中调用的c函数定义,实现加法
int csum(lua_State* L)
{
	int a = lua_tointeger(L,1);
	int b = lua_tointeger(L,2);
	lua_pushinteger(L,a+b);
	return 1 ;
}
int _tmain(int argc, _TCHAR* argv[])
{
	lua_State * L = luaL_newstate() ;        //创建lua运行环境
	if (L == NULL) 
	{
		printf("创建lua运行环境出错!!!/n");
	}

	luaL_openlibs(L);    //加载所有lua库,很重要,没这个语句不能用table.getn等

	int ret = 0 ;
	ret = luaL_loadfile(L,"func.lua") ;      //加载lua脚本文件
	if ( ret != 0 ) 
	{
		printf("加载lua脚本文件出错!!!/n");
	}

	ret = lua_pcall(L,0,0,0) ;				//这句的作用应该是初始化lua栈,和重新加载函数的作用建议luaL_loadfile后都调用一次
	if ( ret != 0 ) err_return(-1,"lua_pcall failed:%s",lua_tostring(L,-1)) ;  

	//lua_pushcfunction(L,csum) ;         //注册在lua中使用的c函数
	//lua_setglobal(L,"csum") ;           //绑定到lua中的名字csum  //相当于给全局变量赋值
	//lua_register(L,TOSTRING(csum),csum);   //和上面两句作用相同

	//可以注册成库的形式,比上面单个注册来的方便
	luaL_Reg Reg[] = 
	{
		{TOSTRING(csum),csum},
		{NULL,NULL},			//这里一定要的不然会有问题,因为它不知道什么时候结束
	};
	luaL_register(L,"mylib",Reg);


	lua_getglobal(L,"width");              //获取lua中定义的变量
	lua_getglobal(L,"height");
	printf("height:%ld width:%ld/n",lua_tointeger(L,-1),lua_tointeger(L,-2)) ;
	lua_pop(L,2) ;                        //恢复lua的栈    //小心bug lua_getglobal会入栈

	lua_pushinteger(L,15);                //push操作都会入栈
	lua_setglobal(L,"width");				//此操作会平衡栈,出栈
	lua_pushinteger(L,16);
	lua_setglobal(L,"height");				//设置lua中定义的变量

	lua_getglobal(L,"width");              //获取lua中定义的变量
	lua_getglobal(L,"height");
	printf("height:%ld width:%ld/n",lua_tointeger(L,-1),lua_tointeger(L,-2)) ;
	lua_pop(L,2) ;                        //恢复lua的栈    //小心bug lua_getglobal会入栈

	int a = 11 ;
	int b = 12 ;
	lua_getglobal(L,"sum");               //调用lua中的函数sum
	lua_pushinteger(L,a) ;
	lua_pushinteger(L,b) ;
	ret = lua_pcall(L,2,1,0) ;
	if ( ret != 0 ) err_return(-1,"lua_pcall failed:%s",lua_tostring(L,-1)) ;
	printf("sum:%d + %d = %ld/n",a,b,lua_tointeger(L,-1)) ;
	lua_pop(L,1) ;

	const char str1[] = "hello" ;
	const char str2[] = "world" ;
	lua_getglobal(L,"mystrcat");          //调用lua中的函数mystrcat
	lua_pushstring(L,str1) ;
	lua_pushstring(L,str2) ;
	ret = lua_pcall(L,2,1,0) ;
	if ( ret != 0 ) err_return(-1,"lua_pcall failed:%s",lua_tostring(L,-1)) ;
	printf("mystrcat:%s%s = %s/n",str1,str2,lua_tostring(L,-1)) ;
	lua_pop(L,1) ;

	lua_getglobal(L,"mysum");           //调用lua中的mysum函数,该函数调用本程序中定义的csum函数实现加法
	lua_pushinteger(L,a) ;
	lua_pushinteger(L,b) ;
	ret = lua_pcall(L,2,1,0) ;
	if ( ret != 0 ) err_return(-1,"lua_pcall failed:%s",lua_tostring(L,-1)) ;
	printf("mysum:%d + %d = %ld/n",a,b,lua_tointeger(L,-1)) ;
	lua_pop(L,1) ;

	/////////////////////////////下面是table的用法/////////////////////////////////////////////
	lua_getglobal(L,"retargnum");          //调用lua中的函数retargnum
	lua_newtable(L);
	lua_pushnumber(L,8);    //压入key
	lua_pushstring(L,"w");  //压入Value
	lua_settable(L,-3);     //只能一次一次的压入
	lua_pushnumber(L,7);    //压入key
	lua_pushstring(L,"w2");  //压入Value
	lua_settable(L,-3);
	ret = lua_pcall(L,1,1,0) ;
	if ( ret != 0 ) err_return(-1,"lua_pcall failed:%s",lua_tostring(L,-1)) ;
	printf("retargnum[1] ret = %s/n",lua_tostring(L,-1)) ;
	lua_pop(L,1); 
	//////////////////////////////////////////////////////////////////////////

	ret = luaL_loadfile(L,"func2.lua") ;      //加载lua脚本文件
	if ( ret != 0 ) 
	{
		printf("加载lua脚本文件出错!!!/n");
	}

	ret = lua_pcall(L,0,0,0) ; //如果没有这句的话retargnum将会调用以前lua的同名函数
	if ( ret != 0 ) err_return(-1,"lua_pcall failed:%s",lua_tostring(L,-1)) ;

	//覆盖了func.lua里面的retargnum
	lua_getglobal(L,"retargnum");          //调用lua中的函数retargnum
	lua_newtable(L);
	//以数字为下标的数组
	lua_pushinteger(L,8);  //push value
	lua_rawseti(L,-2,1);   //下标从1开始
	lua_pushinteger(L,7);  //push value
	lua_rawseti(L,-2,2);   //下标从1开始
	ret = lua_pcall(L,1,1,0) ;
	if ( ret != 0 ) err_return(-1,"lua_pcall failed:%s",lua_tostring(L,-1)) ;
	printf("retargnum[1] ret = %d/n",lua_tointeger(L,-1)) ;
	lua_pop(L,1); 

	lua_getglobal(L,"mysum");           //调用lua中的mysum函数,该函数调用本程序中定义的csum函数实现加法
	lua_pushinteger(L,a) ;
	lua_pushinteger(L,b) ;
	ret = lua_pcall(L,2,1,0) ;
	if ( ret != 0 ) err_return(-1,"lua_pcall failed:%s",lua_tostring(L,-1)) ;
	printf("mysum:%d + %d = %ld/n",a,b,lua_tointeger(L,-1)) ;
	lua_pop(L,1) ;

	lua_getglobal(L,"retglobalwidth");           //
	ret = lua_pcall(L,0,1,0) ;
	if ( ret != 0 ) err_return(-1,"lua_pcall failed:%s",lua_tostring(L,-1)) ;
	printf("retglobalwidth = %d/n",lua_tointeger(L,-1)) ;
	lua_pop(L,1) ;

	lua_close(L) ;   //释放lua运行环境

	getchar();
	return 0 ;
}
回复 支持 反对

使用道具 举报

6

主题

15

帖子

163

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
163
板凳
 楼主| 发表于 2017-8-21 18:59:15 | 只看该作者
[C] 纯文本查看 复制代码
rregrgerg
回复 支持 反对

使用道具 举报

小黑屋|手机版|Archiver|Comsenz Inc.  

GMT+8, 2024-11-23 15:27 , Processed in 0.098187 second(s), 26 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表