91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Lua怎么調用C/C++函數/庫

發布時間:2021-10-14 10:51:01 來源:億速云 閱讀:213 作者:柒染 欄目:編程語言

Lua怎么調用C/C++函數/庫,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

test.cpp文件

/*Lua調用C/C++函數/庫(函數壓棧方式)*/
#include<iostream>
using namespace std;
#include<lua.hpp>

/*
當我們需要在Lua里面調用C/C++函數時,所有的函數都必須滿足以下函數簽名:
typedef int (*lua_CFunction) (lua_State *L);換句話說,所有的函數必須接收一個lua_State作為參數,同時返回一個整數值。因為這個函數使用Lua棧作為參數,所以它可以從棧里面讀取任意數量和任意類型的參數。而這個函數的返回值則表示函數返回時有多少返回值被壓入Lua棧。(因為Lua的函數是可以返回多個值的)
*/
static int math_abs(lua_State *L)
{   
    lua_pushnumber(L, abs((int)luaL_checknumber(L, 1))); //獲取傳入的參數
    return 1;
}

static int math_cos(lua_State *L)
{
    lua_pushnumber(L, cos((double)luaL_checknumber(L, 1)));
    return 1;
}

static int math_sin(lua_State *L)
{
    lua_pushnumber(L, sin((double)luaL_checknumber(L, 1)));
    return 1;
}

static int ShowMessage(lua_State * L)
{
    lua_pushnumber(L, 1000);
    printf("show message and push 1000 \n");
    return -1;
}

//注冊函數
void regist_function(lua_State *L)
{
    //壓棧后設置一個lua可調用的全局函數名
    lua_pushcfunction(L, ShowMessage);
    lua_setglobal(L, "showmessage");
    //c調用lua
    lua_getglobal(L, "SHOWMESSAGE");
    lua_pcall(L, 0, 0, 0);
    printf("get the showmessage pushed value %f \n", lua_tonumber(L, -1));

    //#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))
    //lua_register的定義如上,所有 lua_pushcfunction(L, ShowMessage);lua_setglobal(L, "showmessage"); <==>lua_register(L, "showmessage", ShowMessage);
    lua_register(L, "cos", math_cos);
    //測試
    lua_getglobal(L, "COS");
    lua_pushnumber(L, 0.5);
    if (0 != lua_pcall(L, 1, 1, 0))
    {
        printf("cpp call lua function failed\n");
    }
    printf("cos(0.5)=%f\n", lua_tonumber(L, -1));
    lua_pop(L, 1);
}
//注冊庫函數
void regist_lib(lua_State *L)
{
    static const luaL_reg mathlib[] = {
        { "abs", math_abs },
        { "cos", math_cos },
        { "sin", math_sin },
        { NULL, NULL }
    };
    luaL_register(L, "DY_MATH", mathlib);

    //測試
    double sinv = 30*3.1415926/180.0;
    lua_getglobal(L, "SIN");
    lua_pushnumber(L, sinv);
    if (0 != lua_pcall(L, 1, 1, 0))
    {
        printf("cpp call lua function failed\n");
    }
    printf("sin(%f)=%f\n", sinv, lua_tonumber(L, -1));
    lua_pop(L, 1);
}

int main()
{
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);

    char *luapath="LuaCallCTest.lua";
    luaL_dofile(L, luapath);    
    
    regist_function(L);
    regist_lib(L);

    lua_close(L);
    system("pause");
    return 0;
}

LuaCallCTest.lua文件

--region LuaCallCTest.lua

function COS(a)
    print("called COS in lua script")
    --lua調用c/c++函數
    return cos(a)
end

function SIN(a)
    print("called SIN in lua script")
    --lua調用c/c++庫函數
    return DY_MATH.sin(a)
end

function SHOWMESSAGE()
    showmessage()
end

--end region

結果
Lua怎么調用C/C++函數/庫

關于Lua怎么調用C/C++函數/庫問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節
推薦閱讀:
  1. lua mac配置環境
  2. lua指針

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阳谷县| 眉山市| 武安市| 深圳市| 玛沁县| 威远县| 卢湾区| 镶黄旗| 大姚县| 双鸭山市| 东乡族自治县| 当阳市| 琼结县| 大余县| 永善县| 任丘市| 白城市| 大方县| 石阡县| 清水县| 合阳县| 屯门区| 霍州市| 连南| 玛曲县| 疏勒县| 江口县| 仁化县| 东平县| 盱眙县| 新乐市| 嘉黎县| 资中县| 嘉善县| 长顺县| 文成县| 拉萨市| 南汇区| 汨罗市| 剑河县| 滦南县|