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