我的一片天

我的一片天
posts - 27, comments - 12, trackbacks - 0, articles - 16
   :: 首页 :: 新随笔 :: 联系 ::  :: 管理

Lua新手上路之千里之行始于足下(DELPHI)

Posted on 2010-05-15 22:56 xyz 阅读(1026) 评论(3)  编辑 收藏 引用 所属分类: Lua

经过瞎子摸象篇,我们已经对lua有了初步感受。下面就开始我们的千里之行了。
下面我们尝试调用带参数的lua脚本函数。把之前的test.lua的内容做一下变动。
--test.lua
function add(x)
x=x+100
return x
end

把传入的数加100后返回。
把button事件里的代码修改成以下的内容
var

L: Plua_State;     //lua的引用类型,所有的lua方法都要用到这个

begin

  L := lua_open;  //建立一个lua的引用
  lua_baselibopen(L);   //引入lua的基础库函数
  luaL_loadfile(L, 'test.lua');  //载入我们的lua脚本
  lua_resume(L,0);              //解析脚本到lua
 
  lua_getglobal(L, 'add');     //设置即将要调用的lua脚本函数add
  lua_pushnumber(L, 100); //设置完函数名就要接着设置函数的参数了www.cnitblog.com/xkz
  //注意下面lua_pcall参数的编号哦
  if lua_pcall(L, 1, 1,0)<>0 then //调用函数,一个参数,一个返回值 ,函数正确返回0
  begin
     showmessage(lua_tostring(L,-1)); //错误信息
  end
  else
     showmessage(lua_tostring(L,-1));;//返回的参数

  lua_pop(L, 1);
  lua_close(L);

end;

怎么样,是不是挺简单的~~成功迈出第一步,我们离目标就近了一步。
总结一下我们到目前学习到的东西。
在调用函数之前的准备工作是必备工作,如下面的几行代码,基本上会使用到。载入脚本和编译脚本还有其他的几种方法,但是那些等我们对lua有更深的了解后再学习。现在只要知道这几行,你的lua就算初始化好了。
  L := lua_open;  //建立一个lua的引用
  lua_baselibopen(L);   //引入lua的基础库函数
  luaL_loadfile(L, 'test.lua');  //载入我们的lua脚本
  lua_resume(L,0);              //解析脚本到lua

做完初始化后,就是函数的调用了。要调用函数,自然是要有函数名了,然后再是函数的参数
  lua_getglobal(L, 'add');     //设置即将要调用的lua脚本函数add
  lua_pushnumber(L, 100); //设置完函数名就要接着设置函数的参数了www.cnitblog.com/xkz
 
当有2个,3个参数要怎么设置呢,当然是继续用 lua_pushnumber来设置参数了(实质是类似于汇编语言的压入参数,如果对汇编没概念,就姑且认为是设置参数吧)
这是要注意的是设置参数的顺序,假如有个函数 fun(a,b,c)参个函数,那就要从右边向左的顺序来设置参数,应该按下面的方法
lua_pushnumber(L, c);
lua_pushnumber(L, b);
lua_pushnumber(L, a);

说完参数的设置顺序,那我们该说说返回值了,我们不得不继续说说lua是如何操作参数的,如果说函数的参数是我们设置给lua的,那返回值就是lua设置给我们的。
lua采用类似汇编的栈的概念的,就像手 枪的弹 夹一样,我们在设置我们需要调用的函数之前,lua的栈就像一个空夹,放入的第一颗子 弹就是函数名,它会在弹 夹的最底,然后分别是放入第2颗子 弹,就是上面说的参数c,然后第3颗(参数b),第4颗(参数a)。
好,现在我们安了4颗子 弹到弹 夹里,满足函数fun的调用条件了,这时用lua_pcall(L, 1, 1,0)告诉lua可以发 射了,lua会一口气把所有的子 弹打空(就是lua教材里说的,lua调用后会清空栈).
lua把你装的子 弹打完后,由于你设置了返回参数的个数(lua_pcall中的参数),因此lua也不白打你的子 弹,它会按你的要求,重新给弹 夹装上另外一批子 弹,这批子 弹叫返回值,因为lua是支持返回多个值的,例如 return x,y,z (请看教材)。x子 弹被最新装入弹 夹,其次是y,最后是z。

啰嗦了这么多,我们要说lua_tostring(L,-1));了,第2个参数-1,代表的就是弹 夹的底部,因为lua的起始序号跟delphi不同,比如delphi的数组是从0开始,而lua是从1开始。
1代表弹 夹底,2是从底部起的第2个位置,那-1自然就代表顶了,就是12发子 弹的弹 夹的最上面那颗子 弹了(第12颗),-2是从顶部的第2个位置。
我们上面的代码lua_tostring就是把值转换成字符串型,如果你要数字型,可以调用lua_tonumber (可以参考教材)。

有了千里的第一步,我们已经可以持续的向前方大步迈进了。

Feedback

# re: Lua新手上路之千里之行始于足下(DELPHI)  回复  更多评论   

2011-07-19 18:40 by sohi
attempt to call a number value
Delphi 7

# re: Lua新手上路之千里之行始于足下(DELPHI)  回复  更多评论   

2011-07-19 19:12 by sohi
用floattostr 转换了一下返回是0

# re: Lua新手上路之千里之行始于足下(DELPHI)  回复  更多评论   

2011-07-19 19:14 by sohi
不是应该返回100的么
只有注册用户登录后才能发表评论。