您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Lua中怎么調(diào)用C函數(shù),文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
Lua調(diào)用C語言中的函數(shù)是通過棧來進(jìn)行參數(shù)傳遞的,這與大部分編程語言的內(nèi)部函數(shù)調(diào)用的實(shí)現(xiàn)一致。
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include <stdio.h>
#include <sys/time.h>
static int i_add(lua_State * L)
{
// 獲取第一個(gè)函數(shù)參數(shù)
double a = luaL_checknumber(L, 1);
printf("第一個(gè)參數(shù):%f\n", a);
// 獲取第二個(gè)函數(shù)參數(shù)
double b = luaL_checknumber(L, 2);
printf("第二個(gè)參數(shù):%f\n", b);
// 設(shè)置函數(shù)返回值
lua_pushnumber(L, a + b);
// 函數(shù)返回值的數(shù)量,在這里函數(shù)返回值為1
return 1;
}
static int i_swap(lua_State * L)
{
int i = lua_tointeger(L, 1);
int j = lua_tointeger(L, 2);
printf("%d 和 %d 交換位置\n", i, j);
lua_pushinteger(L, j);
lua_pushinteger(L, i);
return 2;
}
// 計(jì)算斐波拉契數(shù)列
static int i_fib(lua_State * L)
{
// lua_Integer長度為64位,防止溢出(事實(shí)上當(dāng)n的值達(dá)到100左右即使64位也會(huì)發(fā)生溢出了)
lua_Integer sum = 0;
lua_Integer a = 0; // n - 2
lua_Integer b = 0; // n - 1
int n = lua_tointeger(L, 1);
int i = 0;
while (i <= n) {
// printf("sum is %d\n", sum);
i++;
if (i == 1) {
a = 0;
b = 1;
}
sum = a + b;
a = b;
b = sum;
}
lua_pushinteger(L, sum);
return 1;
}
// 獲取當(dāng)前的毫秒時(shí)間戳
static int i_time(lua_State * L)
{
struct timeval tv;
gettimeofday( &tv, NULL );
double t = tv.tv_sec + (double)((int)(tv.tv_usec*0.001) * 0.001);
// 以整數(shù)返回
lua_pushinteger(L, (lua_Integer)(t * 1000));
return 1;
}
// 打開名為mylib的庫,在Lua中使用require('mylib')可以調(diào)用mylib中的函數(shù)
int luaopen_mylib(lua_State * L)
{
// 對(duì)函數(shù)進(jìn)行注冊(cè),之后在Lua中可以直接調(diào)用
lua_register(L, "add", i_add);
lua_register(L, "swap", i_swap);
lua_register(L, "fib_c", i_fib);
lua_register(L, "current_time", i_time);
return 0;
}
我們把上面的代碼保存在 mylib.c
文件中,隨后使用如下命令對(duì)源代碼進(jìn)行編譯得到 mylib.so
文件
gcc mylib.c -fPIC -shared -o mylib.so -I/usr/local/include/lua5.3 -llua5.3
得到動(dòng)態(tài)鏈接庫之后我們?cè)诋?dāng)前文件夾下創(chuàng)建 test.lua
文件,之后輸入如下代碼
package.cpath = './?.so;' .. package.cpath -- 把庫文件添加到環(huán)境變量中
require('mylib')
print(add(1, 2))
print(swap(2333, 666))
-- 計(jì)算斐波那契數(shù)列
fib_lua = function(n)
sum = 0
a = 0 -- n - 2
b = 0 -- n - 1
i = 0
repeat
i = i + 1
if i == 1 then
a = 0
b = 1
end
sum = a + b
a = b
b = sum
until i > n
return sum
end
n = 10000000 -- 計(jì)算的斐波那契數(shù)列位數(shù)
-- 使用lua計(jì)算
start = current_time()
fib_lua(n)
luaCost = current_time() - start
print(luaCost)
-- 使用C語言計(jì)算
start = current_time()
fib_c(n)
cCost = current_time() - start
print(cCost)
-- 計(jì)算lua與C語言的耗時(shí)比
print(luaCost / cCost)
執(zhí)行 lua test.lua
得到如下結(jié)果:
第一個(gè)參數(shù):1.000000
第二個(gè)參數(shù):2.000000
3.0
2333 和 666 交換位置
666 2333
1887
40
47.175
關(guān)于Lua中怎么調(diào)用C函數(shù)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。