lua調用C++函數

第一步搭建lua的環境.

win10 lua環境搭建-CSDN博客

我使用的環境是win10+vs2015+lua54

先來個最簡單的lua調用C++函數,

無參數無返回值的

第一步:定義C++函數.

int CTest(lua_State* L) // 返回值是固定的int類型,返回0表示沒有返回參數,返回1表示有一個返回參數
{std::cout << "int CTest" << std::endl;return 0;
}

這個函數,除了函數名可以自己定義其他的都要按這個來定義.

返回值是固定的int類型,返回0表示沒有返回參數,返回1表示有一個返回參數.

第二步:注冊函數.

lua_register(lua,"CTest",CTest);?

第一個參數是lua的lua_State的指針,第二個是lua的注冊函數名字,這個名字是在lua代碼里使用的,第三個參數是函數指針就是剛才定義的C++函數.

#include <iostream>
extern "C"
{
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
}int CTest(lua_State* L) // 返回值是固定的int類型,返回0表示沒有返回參數,返回1表示有一個返回參數
{std::cout << "int CTest" << std::endl;return 0;
}int main()
{lua_State *lua = luaL_newstate();luaopen_base(lua);luaopen_string(lua);lua_register(lua,"CTest",CTest); //第一個參數是lua狀態指針,第二個參數是函數名稱,第三個參數是lua函數指針,第二個參數和第三個參數可以用不同的名字,但第三個必須使用正確的函數指針luaL_loadfile(lua, "D:\\code\\MyCode\\C++\\Lua\\CPPAddLua\\testLua\\x64\\Debug\\main.lua");lua_pcall(lua, 0,0,0);getchar();return 0;
}

直接運行

這樣就是lua調用到了C++函數.當然這里lua調用C++ 函數是指在C++代碼中的調用.

lua傳遞參數,沒有返回值

只需要從lua的堆棧拿出一個參數即可.在此之前還需要再注冊一下.

lua_register(lua, "CTestToString", CTestToString);
const char* luaStr = lua_tostring(L,1);

?這樣得到的就是lua傳遞的參數.

int CTestToString(lua_State* L)
{const char* luaStr = lua_tostring(L,1);std::cout << luaStr << std::endl;return 0;
}

?

?傳第二個參數就再獲取一下第二個參數.

?

int num = lua_tointeger(L,2);
int CTestToString(lua_State* L)
{const char* luaStr = lua_tostring(L,1);std::cout << luaStr << std::endl;int num = lua_tointeger(L,2);std::cout << num << std::endl;return 0;
}

?

傳遞普通參數就這樣傳遞.

lua傳遞數組給C++函數

第一步注冊函數:

lua_register(lua, "CTestArr", CTestArr);

第二步:編寫接收函數

int CTestArr(lua_State* L)
{std::vector<std::string> vStr;std::cout << "int CTestArr" << std::endl;int arraySize = luaL_len(L, 1); //獲取表的大小for (int i = 1; i <= arraySize; ++i){lua_pushnumber(L,i);	//往棧中壓入一個數字,表示從數組中取那個下標的值,lua都是從1開始的所以i從1開始lua_gettable(L, 1);		//把上一行索引的位置出棧,再把i壓入 棧vStr.push_back(lua_tostring(L,-1));lua_pop(L,1);}for (auto& value : vStr){std::cout << value << std::endl;}return 0;
}

第三步:lua調用

.

lua傳遞表給C++函數

lua_next3(L,3)

  1. 先從棧頂彈出一個key
  2. 從棧指定位置的table里取下一對key-value,先將key入棧再將value入棧
  3. 如果第2步成功則返回非0值,否則返回0,并且不向棧中壓入任何值.

第一步注冊函數:

lua_register(lua, "CTestTable", CTestTable);

第二步:

int CTestTable(lua_State* L)
{std::cout << "int CTestTable" << std::endl;std::map<std::string, std::string> mStr;lua_pushnil(L);while (lua_next(L, 1) != 0){mStr[lua_tostring(L, -2)] = lua_tostring(L,-1);lua_pop(L,1);}for (auto& value : mStr){std::cout << value.first << " = " << value.second << std::endl;}return 0;
}

第三步lua調用:

?結果:

lua調用C++ 獲取表中的內容

	lua_getfield(L,1,"name");std::cout << lua_tostring(L,-1) << std::endl;

Lua調用C++參數類型檢查

	luaL_checktype(L,1,LUA_TBOOLEAN);if (lua_type(L, 1) != LUA_TBOOLEAN){luaL_argerror(L,1,"bad argument");}

第一行,一旦不匹配代碼就不會往下執行,

第二行的不匹配還會往下執行.

Lua調用C++ 返回值普通類型

第一步:注冊函數:

lua_register(lua, "TestRe", TestRe);

第二步寫函數:

int TestRe(lua_State* L)
{lua_pushstring(L,"return value");return 1;
}

一個返回參數就返回1,兩個就返回2

第三步lua代碼

結果:

lua返回表

第一步注冊函數:

lua_register(lua, "TestReTable", TestReTable);

第二步寫注冊函數

int TestReTable(lua_State* L)
{lua_newtable(L);  // 創建一個表格,放在棧頂lua_pushstring(L,"name"); // 壓入keylua_pushstring(L,"ccname");//壓入valuelua_settable(L,-3); //彈出key value,并設置到表,表在棧頂了作為返回值lua_pushstring(L, "age"); // 壓入keylua_pushinteger(L, 21);//壓入valuelua_settable(L, -3); //彈出key value,并設置到表,表在棧頂了作為返回值return 1;
}

第三步:lua

結果:

C++全部代碼:

#include <iostream>
extern "C"
{
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
}
#include <vector>
#include <string>
#include <map>int CTest(lua_State* L) // 返回值是固定的int類型,返回0表示沒有返回參數,返回1表示有一個返回參數
{std::cout << "int CTest" << std::endl;return 0;
}int CTestToString(lua_State* L)
{const char* luaStr = lua_tostring(L,1);std::cout << luaStr << std::endl;int num = lua_tointeger(L,2);std::cout << num << std::endl;bool is = lua_toboolean(L, 3);std::cout << is << std::endl;return 0;
}int CTestArr(lua_State* L)
{std::vector<std::string> vStr;std::cout << "int CTestArr" << std::endl;int arraySize = luaL_len(L, 1); //獲取表的大小for (int i = 1; i <= arraySize; ++i){lua_pushnumber(L,i);	//往棧中壓入一個數字,表示從數組中取那個下標的值,lua都是從1開始的所以i從1開始lua_gettable(L, 1);		//把上一行索引的位置出棧,再把i壓入 棧vStr.push_back(lua_tostring(L,-1));lua_pop(L,1);}for (auto& value : vStr){std::cout << value << std::endl;}return 0;
}int CTestTable(lua_State* L)
{std::cout << "int CTestTable" << std::endl;/*   讀取全部的表的內容 */std::map<std::string, std::string> mStr;lua_pushnil(L);while (lua_next(L, 1) != 0){mStr[lua_tostring(L, -2)] = lua_tostring(L,-1);lua_pop(L,1);}for (auto& value : mStr){std::cout << value.first << " = " << value.second << std::endl;}/* 只取一個lua_getfield(L,1,"name");std::cout << lua_tostring(L,-1) << std::endl;*/return 0;
}int TestRe(lua_State* L)
{lua_pushstring(L,"return value");return 1;
}int TestReTable(lua_State* L)
{lua_newtable(L);  // 創建一個表格,放在棧頂lua_pushstring(L,"name"); // 壓入keylua_pushstring(L,"ccname");//壓入valuelua_settable(L,-3); //彈出key value,并設置到表,表在棧頂了作為返回值lua_pushstring(L, "age"); // 壓入keylua_pushinteger(L, 21);//壓入valuelua_settable(L, -3); //彈出key value,并設置到表,表在棧頂了作為返回值return 1;
}int main()
{lua_State *lua = luaL_newstate();luaopen_base(lua);luaopen_string(lua);lua_register(lua,"CTest",CTest); //第一個參數是lua狀態指針,第二個參數是函數名稱,第三個參數是lua函數指針,第二個參數和第三個參數可以用不同的名字,但第三個必須使用正確的函數指針lua_register(lua, "CTestToString", CTestToString);lua_register(lua, "CTestArr", CTestArr);lua_register(lua, "CTestTable", CTestTable);lua_register(lua, "TestRe", TestRe);lua_register(lua, "TestReTable", TestReTable);luaL_loadfile(lua, "D:\\code\\MyCode\\C++\\Lua\\CPPAddLua\\testLua\\x64\\Debug\\main.lua");lua_pcall(lua, 0,0,0);getchar();return 0;
}

lua全部代碼:

CTest()CTestToString("lua string",123456,true)
local arr = {"A001","A002","A003"};
CTestArr(arr)
local tab = {name="xiaoming",age="22",id="007"};
CTestTable(tab)local re = TestRe()
print("re = " .. re)local retab = TestReTable()
print("name = " .. retab["name"])
print("name = " .. retab["age"])

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/718994.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718994.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718994.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

K8S高級篇:138頁經典實戰案例,圖文并茂代碼齊全,僅限3天分享

相信很多朋友都聽過云原生和容器技術&#xff0c;當然也少不了K8S的大名&#xff0c;在“容器技術革命”中&#xff0c;K8S儼然已經成為容器技術的事實標準&#xff0c;各個知名互聯網企業前仆后繼地擁抱云原生&#xff0c;爭先恐后地把容器和K8S作為戰略重心之一。 容器技術發…

HTTP頭部信息解釋分析(詳細整理)

這篇文章為大家介紹了HTTP頭部信息&#xff0c;中英文對比分析&#xff0c;還是比較全面的&#xff0c;若大家在使用過程中遇到不了解的&#xff0c;可以適當參考下 HTTP 頭部解釋 1. Accept&#xff1a;告訴WEB服務器自己接受什么介質類型&#xff0c;*/* 表示任何類型&#…

WordPress上傳圖片錯誤:不是合法的JSON響應

最近在進行WordPress遷移至新服務器的過程中&#xff0c;遭遇到一個棘手的問題&#xff0c;即在編輯文章并上傳圖片時&#xff0c;不斷遭遇“此響應不是合法的JSON響應”的錯誤。經過多次驗證和搜索&#xff0c;最終確定問題的根本原因并不在于禁用 Gutenberg 編輯器或安裝經典…

CSS變量和@property

CSS變量 var() CSS 變量是由CSS作者定義的實體&#xff0c;其中包含要在整個文檔中重復使用的特定值。使用自定義屬性來設置變量名&#xff0c;并使用特定的 var() 來訪問。&#xff08;比如 color: var(--main-color);&#xff09;。 基本用法 CSS變量定義的作用域只在定義該…

【Kotlin】函數

1 常規函數 1.1 無參函數 fun main() {myFun() }fun myFun() {println("myFun") // 打印: myFun } 1.2 有參函數 1&#xff09;常規調用 fun main() {myFun("myFun") // 打印: myFun }fun myFun(str: String) {println(str) } 2&#xff09;形參指定默…

根據條件查詢下載Excel表單(Java+Vue 及 Vue 兩種方式)

目錄 前言1. 基本知識2. 純前端導入導出&#xff08;Vue&#xff09;3. 前后端&#xff08;Vue Java&#xff09; 前言 如果想要下載好看的Excel推薦閱讀&#xff1a; 詳細講解Java使用EasyExcel函數來操作Excel表&#xff08;附實戰&#xff09;詳細講解Java使用HSSFWorkbo…

23.基于springboot + vue實現的前后端分離-在線旅游網站系統(項目 + 論文PPT)

項目介紹 本旅游網站系統采用的數據庫是MYSQL &#xff0c;使用 JSP 技術開發&#xff0c;在設計過程中&#xff0c;充分保證了系統代碼的良好可讀性、實用性、易擴展性、通用性、便于后期維護、操作方便以及頁面簡潔等特點。 技術選型 后端: SpringBoot Mybatis 數據庫 : MyS…

RK android11 user打開adb調試功能

目錄build/make/core diff --git a/core/main.mk b/core/main.mk --- a/core/main.mk b/core/main.mk -280,7 280,7 ifneq (,$(user_variant)) ADDITIONAL_DEFAULT_PROPERTIES security.perf_harden1 ifeq ($(user_variant),user) - ADDITIONAL_DEFAULT_PROPER…

機器學習:原理、應用與未來展望

第一章 是什么 機器學習&#xff08;Machine Learning&#xff09;是一門跨學科的學科&#xff0c;它使用計算機模擬或實現人類學習行為&#xff0c;通過不斷地獲取新的知識和技能&#xff0c;重新組織已有的知識結構&#xff0c;從而提高自身的性能。機器學習涉及多個學科&am…

wordpress 開源主題

海外就醫wordpress主題 出國看病、海外就醫是越來越多中產家庭的選擇&#xff0c;此wordpress主題適合做相關業務的公司官網。 https://www.jianzhanpress.com/?p5220 防護wordpress外貿主題 個人防護器具wordpress外貿主題&#xff0c;適合做勞動保護的外貿公司使用。 ht…

微信小程序中使用特使字體

1、首先下載字體文件 推薦幾個常用下載字體的網站 https://font.chinaz.com/zhongwenziti.html https://www.hellofont.cn/ 2、轉換字體 使用下面這個網站進行字體轉換 https://transfonter.org/ 點擊add fonts 按鈕進行上傳剛剛下載的字體文件選擇formats格式&#xff1a;可…

關于CSS 優先級布局應用的教程

在前端開發中&#xff0c;CSS 的優先級布局是非常重要的一部分。通過合理地應用 CSS 優先級&#xff0c;我們可以更加靈活地控制頁面的布局和樣式。本教程將向您介紹如何利用 CSS 優先級進行布局&#xff0c;并通過實例展示其應用。 1. 了解 CSS 優先級 在 CSS 樣式表中&…

【生活】程序人生之日常生活篇(附塑料分類標志 常用日常好物)

程序員生活指南之 【生活】程序人生之日常生活篇&#xff08;附塑料分類標志 & 常用日常好物&#xff09; 文章目錄 1、關于本文2、居家相關2.1 蟑螂大戰2.2 房間收納&#xff08;寢室&#xff0c;租房&#xff0c;家里&#xff09;2.3 智能家居2.4 臺燈選購2.5 塑料分類標…

深圳mes系統在智能制造中的重要意義

深圳mes系統在生產中具有重要意義&#xff0c;主要體現在以下幾個方面&#xff1a; 生產計劃可視化和優化&#xff1a;MES系統通過大量收集和分析工廠內部的實時數據&#xff0c;將數據可視化展示給運營和管理層&#xff0c;使企業決策者能夠更加有效地進行生產計劃的制定和…

高級優化理論與方法(二)

高級優化理論與方法&#xff08;二&#xff09; 上節回顧ConstrainedUnconstrainedFONCSONCexample 這節課的內容SOSC定理敘述證明例子 One-dimensional Search MethodsIterative MethodGolden Section SearchMethodIssues方法推理算法描述TimeExample Fibonacci MethodBisecti…

教師觀包括哪些內容是什么

站在講臺上的老師&#xff0c;除了教你知識&#xff0c;還有哪些不為人知的角色和面孔&#xff1f;讓我們一起揭開教師觀的神秘面紗&#xff0c;看看老師們的“千面人生”。 現代教師已不再是單純的知識傳遞者&#xff0c;他們更像是學習旅程中的導游和指南針。他們引導學生發現…

嵌入式Qt 對話框及其類型 QDialog

一.對話框的概念 對話框是與用戶進行簡短交互的頂層窗口。 QDialog是Qt中所有對話框窗口的基類。 QDialog繼承與QWidfet是一種容器類型的組件。 QDialog的意義&#xff1a; QDialog作為一種專業的交互窗口而存在。 QDialog不能作為子部部件嵌入其他容器中。 QDialog是定制…

反函數的理解|反函數到底“反”的是什么?什么是反函數?

理解 將 yex 函數圖像連同整個坐標系繞著 yx 旋轉 180 度&#xff0c;會變成下面的圖像 只是把圖像轉了一下&#xff0c;函數還是那個函數&#xff0c;還是 yex &#xff0c;此時橫軸變成了 y 軸&#xff0c;縱軸變成了 x 軸 根據習慣&#xff0c;一般把縱軸當作因變量、把橫軸…

如何在騰訊云輕量應用服務器上安裝Docker的詳細步驟是什么?

如何在騰訊云輕量應用服務器上安裝Docker的詳細步驟是什么&#xff1f; 登錄騰訊云輕量應用服務器&#xff1a;首先&#xff0c;需要登錄到騰訊云官方網站&#xff0c;并進入輕量應用服務器控制臺。 軟件源設置&#xff1a;在輕量應用服務器控制臺中選擇“更多”>“設置”&…

JavaScript實現的計時器效果

之前做過電商網站倒計時的效果&#xff0c;今天在倒計時的基礎上&#xff0c;把代碼修改了一下&#xff0c;改為計時器效果&#xff0c;實現了以下功能&#xff1a; 1.點擊“開始”后&#xff0c;按秒計時且“開始”文字變為“停止”&#xff1b; 2.點擊“停止”&#xff0c;計…