Lua脚本是一种可用于C程序开发/测试的工具,本篇介绍一下C程序与Lua脚本如何进行相互调用,更加详细的操作参见《Programing in Lua》。本文分为3个部分:1、Windows环境下Lua的下载以及安装注意事项;2、Visual C++6.0中Lua的配置;3、C程序与Lua脚本相互调用实例。

  1、Windows环境下Lua的下载以及安装注意事项

  a、下载Lua for Windows,笔者用的版本是V5.1.4-35;

  b、上微软官网,下载Visual C++运行库——vcredist_x86.exe

  c、将LuaForWindows_v5.1.4-35.exe和vcredist_x86.exe放在同一目录下,直接点击LuaForWindows_v5.1.4-35.exe,安装即可,建议将Lua安装在D盘根目录下;

  d、安装成功之后,使用Lua目录下SciTE编辑器,就可以编写lua脚本,点击“执行”按钮,就可以查看执行结果。

  

  2、Visual C++6.0中Lua的配置

  a、新建一个工程LuaMutualCallCMethod,选择Tools--->Options--->Directories,配置VC++的目录项:

  (1)Include files,添加“D:\LUA\5.1\INCLUDE”;

  (2)Library files,添加“D:\LUA\5.1\LIB”;

  (3)Executable files,添加“D:\LUA\5.1”;

  b、配置工程的链接属性,选择Project--->Setting---->Link,添加lua5.1.lib;

  3、C程序与Lua脚本相互调用实例

  a、C程序调用Lua脚本

  (1)创建Lua数据脚本data.lua  

length =
width =
heigth =

  (2)创建C程序main.c,读取test.lua中的数据,并打印输出  

#include <stdio.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h> void main()
{
int retCode;
lua_State *L = luaL_newstate();
luaL_openlibs(L);
retCode = luaL_dofile(L,"data.lua");
if (retCode != )
{
printf("error %s\n",lua_tostring(L,-));
return;
}
lua_getglobal(L,"length");
lua_getglobal(L,"width");
lua_getglobal(L,"heigth"); printf("length=%d\n",lua_tointeger(L,-));
printf("width=%d\n",lua_tointeger(L,-));
printf("heigth=%d\n",lua_tointeger(L,-)); lua_close(L);
}

  (3)输出结果

      length = 5

      width = 10

      height = 20

  b、Lua脚本调用C程序中的函数

  (1)创建Lua执行脚本compute.lua

sum =
firstPara =
secondPara = sum = addMethod(firstPara,secondPara) printMethod(sum)

  (2)创建C程序CMethodForLua.c,编写与“addMethod”、“printMethod”相对应的C函数,并将其“注册”到Lua环境中;

#include <stdio.h>
#include "CmethodForLua.h" /**********************************************************************
Fuction: Lua_AddMethod
Description: 供Lua调用的加法运算 Parameter: luaEnv --[in] lua执行环境 Return Value: 数字 lua执行后返回参数 Note: Other: 内部函数,仅供CmethodForLua.c调用 *********************************************************************/
static int Lua_AddMethod(lua_State *luaEnv)
{
double firstPara = luaL_checknumber(luaEnv,);
double secondPara = luaL_checknumber(luaEnv,);
lua_pushnumber(luaEnv,firstPara+secondPara);
return ;
} /**********************************************************************
Fuction: Lua_PrintMethod
Description: 供Lua调用的打印运算 Parameter: luaEnv --[in] lua执行环境 Return Value: 数字 lua执行后返回参数 Note: Other: 内部函数,仅供CmethodForLua.c调用 *********************************************************************/
static int Lua_PrintMethod(lua_State *luaEnv)
{
int printData = (int)luaL_checknumber(luaEnv,);
printf("The Print Data is %d\n",printData);
return ;
} /**********************************************************************
Fuction: OpenLuaExecuteEnvironment
Description: 打开Lua执行环境 Parameter: luaEnv --[in/out] lua执行环境 Return Value: 0 执行成功
非0 执行失败,错误码 Note:
1、创建Lua状态;
2、打开Lua标准库
3、注册供Lua调用的C函数; Other: *********************************************************************/
int OpenLuaExecuteEnvironment(lua_State **luaEnv)
{
lua_State *L = NULL;
L = luaL_newstate();
luaL_openlibs(L);
lua_register(L,"addMethod",Lua_AddMethod);
lua_register(L,"printMethod",Lua_PrintMethod);
*luaEnv = L;
return LUA_SUCCESS;
} /**********************************************************************
Fuction: CloseLuaExecuteEnvironment
Description: 关闭Lua执行环境 Parameter: luaEnv --[in] lua执行环境 Return Value: 0 执行成功
非0 执行失败,错误码 Note: Other: *********************************************************************/
int CloseLuaExecuteEnvironment(lua_State *luaEnv)
{
lua_close(luaEnv);
return LUA_SUCCESS;
}

  (3)创建main.c,获取CMethodForLua.c中的Lua执行环境,并执行compute.lua脚本

#include <stdio.h>
#include "CmethodForLua.h" void main()
{
lua_State *luaEnv = NULL;
int retCode;
retCode = OpenLuaExecuteEnvironment(&luaEnv);
if (retCode != LUA_SUCCESS)
{
return;
} //Lua调用C语言函数,
retCode = luaL_dofile(luaEnv,"compute.lua");
if (retCode != LUA_SUCCESS)
{
printf("error %s\n",lua_tostring(luaEnv,-));
return;
} CloseLuaExecuteEnvironment(luaEnv);
}

  (4)输出结果

    The Print Data is 30

  

  

  

C程序与Lua脚本相互调用的更多相关文章

  1. Unity3d 脚本相互调用

    unity中三种调用其他脚本函数的方法 第一种,被调用脚本函数为static类型,调用时直接用  脚本名.函数名().很不实用…… 第二种,GameObject.Find("脚本所在物体名& ...

  2. Lua学习笔记6:C++和Lua的相互调用

        曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有.     新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项 ...

  3. Unity热更新学习(二) —— ToLua c#与lua的相互调用

    tolua 下载地址:http://www.ulua.org/index.html c#调用lua的方法,tolua的官方例子提供了很多种.我初步学了一种在做项目使用的方法.通过DoFile方法执行l ...

  4. ubuntu配置lua环境,并进行c与lua的相互调用

    1.安装lua环境 先查看一下apt可获取的lua版本 我们选择lua5.1版本进行安装 sudo apt install lua5.1 安装完之后测试一下是否安装成功,如果可以正常使用,则lua环境 ...

  5. 九,ESP8266 判断是断电上电(强制硬件复位)之后运行的内部程序还是内部软件复位之后运行的程序(基于Lua脚本语言)

    现在我有一个需求,WIFI模块控制一个继电器,我要做的是如果内部程序跑乱了,造成了内部程序复位重启,那么控制继电器的状态不能改变 如果是设备断电了,然后又来电了,我需要的是继电器一定要是断开才好.不能 ...

  6. LUA脚本调用C场景,使用C API访问脚本构造的表

    LUA调用C lua解析中集成了一些系统服务, 故脚本中可以访问系统资源, 例如, lua脚本可以调用文件系统接口, 可以调用数学库, 但是总存在一些lua脚本中访问不到的系统服务或者扩展功能, 如果 ...

  7. Unity3D 预备知识:C#与Lua相互调用

    在使用Unity开发游戏以支持热更新的方案中,使用ULua是比较成熟的一种方案.那么,在使用ULua之前,我们必须先搞清楚,C#与Lua是怎样交互的了? 简单地说,c#调用lua, 是c# 通过Pin ...

  8. 新姿势!Redis中调用Lua脚本以实现原子性操作

    背景:有一服务提供者Leader,有多个消息订阅者Workers.Leader是一个排队程序,维护了一个用户队列,当某个资源空闲下来并被分配至队列中的用户时,Leader会向订阅者推送消息(消息带有唯 ...

  9. 原生实现C#和Lua相互调用-Unity3D可用

    引言     本篇简单介绍如何在C#中执行Lua脚本,传递数据到Lua中使用,以及Lua中调用C#导出的方法等.在Unity中开发测试,并打IL2CPP的Android包在模拟器上运行通过.Lua版本 ...

随机推荐

  1. 如何解决 win10连了VPN怎么上外网

    当前用户配置%AppData%\Microsoft\Network\Connections\Pbk与所有用户共享配置%ProgramData%\Microsoft\Network\Connection ...

  2. 学韩顺平老师linux教程--笔记

    第二讲:1.startx  进入图形界面2.shutdown -h now 立刻进行关机3.shutdown -r now 现在重新启动计算机4.reboot          现在重新启动计算机5. ...

  3. Opera浏览器导出收藏到Chrome,和几个Chrome的一些小技巧

    Opera浏览器还是不错的,但是用着不是特别爽,老是感觉怪怪的,也说不上来哪里不好. 还是换回了Chrome浏览器,Chrome浏览器有一个让我念念不忘的地方,就是收藏夹会自动显示,当打开网页之后,又 ...

  4. 使用游戏引擎photon打造一款特殊的远程控制软件

    前言 本文主要是介绍photon引擎的一些基本用法,以及使用游戏引擎开发远控的优势 0x1 有一段时候对做游戏的unity开发有些兴趣,在找游戏服务端引擎的时候,突然发现了这款歪果人开发的游戏引擎ph ...

  5. socket入门基础

    #/usr/bin/python #-*- coding:utf-8 -*- import socket ip_port = ('127.0.0.1',111) #创建socket对象 sk = so ...

  6. c#事件机制

    namespace test { class Publisher//出版社 { public delegate void PubComputer(string magazineName);//声明事件 ...

  7. Qt开发中的实用笔记二--中文转码问题和string转换问题:

    一,中文乱码转码问题 1,转码三句话:window下默认是GBK格式,linux下默认是UTF-8,看情况转换UTF-8/GBK QTextCodec::setCodecForTr(QTextCode ...

  8. nginx 反向代理TCP mysql

    stream {upstream mysql { hash $remote_addr consistent; server 10.26.112.12:3306 max_fails=3 fail_tim ...

  9. SSIS自定义数据流组件开发(血路)

    由于特殊的原因(怎么特殊不解释),需要开发自定义数据流组件处理. 查了很多资料,用了不同的版本,发现各种各样的问题没有找到最终的解决方案. 遇到的问题如下: 用VS2015编译出来的插件,在SSDTB ...

  10. D3树状图给指定特性的边特别显示颜色

    D3作为前端图形显示的利器,功能之强,对底层技术细节要求相对比较多. 有一点,就是要理解其基本的数据和节点的匹配规则架构,即enter,update和exit原理,我前面的D3基础篇中有介绍过,不明白 ...