• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >Lua > Lua脚本调用外部脚本

Lua脚本调用外部脚本

作者:hebedich 字体:[增加 减小] 来源:互联网

hebedich 通过本文主要向大家介绍了Lua教程(二):C++和Lua相互传递数据示例等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

test.lua脚本定义main函数如下:

function main(szName, num1, num2)   
  print("main()", szName, num1, num2); 
  local nRandMax = 10000;  
  local nRand = math.random(nRandMax); 
  print("nRand =", nRand) 
  return 1; 
end

</div>

现在我想在test.lua脚本中调用另外一个test1.lua脚本文件中的GetRandMax(),通常的做法是这样的:

function main(szName, num1, num2)   
  print("main()", szName, num1, num2); 
  dofile("test1.lua")   --加载并编译运行脚本 
  local nRandMax = GetRandMax();  
  local nRand = math.random(nRandMax); 
  print("nRand =", nRand) 
  return 1; 
end

</div>

看上去是这样的,非常简单,通过dofile对test1.lua文件进行加载并编译运行,这部操作会将test1.lua文件中的函数和变量压入全局的虚拟栈中,这样就可以实现对GetRandMax()调用。但是这里有个问题:dofile函数接受的是需要引用的外部脚本的路径,如果多次调用会不胜其烦,而且效率不高。可能有人谁说,那我们直接把dofile作为全局函数执行,就像这样:

dofile("test1.lua") 
dofile("test2.lua") 
dofile("test3.lua") 
 
function main(szName, num1, num2)   
  print("main()", szName, num1, num2); 
  local nRandMax = GetRandMax();  --调用test1.lua中的函数 
  local nRand = math.random(nRandMax); 
  print("nRand =", nRand) 
  return 1; 
end

</div>

这样做是可以的,但是仍然有些问题:

    1,如果test.lua文件dofile(test1.lua),而test1.lua文件dofile(test.lua),怎么办!出现循环应用,执行后堆栈溢出;

test.lua:5: too many C levels (limit is 200) in function at line 5 near '"main()"'
</div>
    2,dofile的路径问题,每次都要传入文件的绝对路径,如果路径不正确,无法正常执行,这也是个很烦的事。

cannot open \script\test.lua: No such file or directory
</div>
那怎样做才更好呢?既然dofile有这些的问题,我们就把这些问题解决。在C/C++中实现Include脚本接口函数,在脚本中作为全局函数调用,实现外部脚本文件包含功能。

//脚本接口 TLua_Funcs g_GameFunc[] = { 
  { "Include",        LuaInclude }, 
  { "ReloadAllScript",    LuaReloadAllScript}, 
  { "SayHello",       LuaSayHello }, 
  { "StopGame",       LuaStopGame }, 
};

</div>

在Include函数中使用set集合避免重复包含的问题,获取当前的执行路径拼接成绝对路径,这样就省了不少事;)

Include("\\script\\test1.lua") --Include脚本接口 
 
function main(szName, num1, num2)   
  print("main()", szName, num1, num2); 
  local nRandMax = GetRandMax();  --调用test1.lua中的函数 
  local nRand = math.random(nRandMax); 
  print("nRand =", nRand) 
  return 1; 
end
</div>

</div>

您可能想查找下面的文章:

相关文章

  • Lua中rawset和rawget的作用浅析
  • Lua中调用C++函数实例
  • Lua模拟面向对象示例分享
  • Lua中对table排序实例
  • Lua脚本语言基本语法快速入门教程
  • Lua获取utf8字符串长度和字符串截取并用...代替
  • Lua学习笔记之函数、变长参数、closure(闭包)、select等
  • Lua中的逻辑运算符使用详解
  • Lua教程(十五):输入输出库(I/O库)
  • C语言中通过LUA API访问LUA脚本变量的简单例子

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • lua中使用毫秒精度时间的方法
    • Lua中类的实现
    • Lua中的元方法__newindex详解
    • Lua学习笔记之表和函数
    • Lua中string.len()使用指南
    • Lua中字符串(string)浅析
    • Lua中遍历文件操作代码实例
    • Lua学习笔记之类型与值
    • Lua教程(五):迭代器和泛型for
    • lua中使用packagepath解决多个项目的路径冲突问题

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有