欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報(bào)邀請(qǐng)碼778899分享:開發(fā)語言 lua調(diào)用C++函數(shù)

柚子快報(bào)邀請(qǐng)碼778899分享:開發(fā)語言 lua調(diào)用C++函數(shù)

http://yzkb.51969.com/

第一步搭建lua的環(huán)境.

win10 lua環(huán)境搭建-CSDN博客

我使用的環(huán)境是win10+vs2015+lua54

先來個(gè)最簡(jiǎn)單的lua調(diào)用C++函數(shù),

無參數(shù)無返回值的

第一步:定義C++函數(shù).

int CTest(lua_State* L) // 返回值是固定的int類型,返回0表示沒有返回參數(shù),返回1表示有一個(gè)返回參數(shù)

{

std::cout << "int CTest" << std::endl;

return 0;

}

這個(gè)函數(shù),除了函數(shù)名可以自己定義其他的都要按這個(gè)來定義.

返回值是固定的int類型,返回0表示沒有返回參數(shù),返回1表示有一個(gè)返回參數(shù).

第二步:注冊(cè)函數(shù).

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

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

#include

extern "C"

{

#include

#include

#include

}

int CTest(lua_State* L) // 返回值是固定的int類型,返回0表示沒有返回參數(shù),返回1表示有一個(gè)返回參數(shù)

{

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); //第一個(gè)參數(shù)是lua狀態(tài)指針,第二個(gè)參數(shù)是函數(shù)名稱,第三個(gè)參數(shù)是lua函數(shù)指針,第二個(gè)參數(shù)和第三個(gè)參數(shù)可以用不同的名字,但第三個(gè)必須使用正確的函數(shù)指針

luaL_loadfile(lua, "D:\\code\\MyCode\\C++\\Lua\\CPPAddLua\\testLua\\x64\\Debug\\main.lua");

lua_pcall(lua, 0,0,0);

getchar();

return 0;

}

直接運(yùn)行

這樣就是lua調(diào)用到了C++函數(shù).當(dāng)然這里lua調(diào)用C++ 函數(shù)是指在C++代碼中的調(diào)用.

lua傳遞參數(shù),沒有返回值

只需要從lua的堆棧拿出一個(gè)參數(shù)即可.在此之前還需要再注冊(cè)一下.

lua_register(lua, "CTestToString", CTestToString);

const char* luaStr = lua_tostring(L,1);

?這樣得到的就是lua傳遞的參數(shù).

int CTestToString(lua_State* L)

{

const char* luaStr = lua_tostring(L,1);

std::cout << luaStr << std::endl;

return 0;

}

?

?傳第二個(gè)參數(shù)就再獲取一下第二個(gè)參數(shù).

?

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;

}

?

傳遞普通參數(shù)就這樣傳遞.

lua傳遞數(shù)組給C++函數(shù)

第一步注冊(cè)函數(shù):

lua_register(lua, "CTestArr", CTestArr);

第二步:編寫接收函數(shù)

int CTestArr(lua_State* L)

{

std::vector vStr;

std::cout << "int CTestArr" << std::endl;

int arraySize = luaL_len(L, 1); //獲取表的大小

for (int i = 1; i <= arraySize; ++i)

{

lua_pushnumber(L,i); //往棧中壓入一個(gè)數(shù)字,表示從數(shù)組中取那個(gè)下標(biāo)的值,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調(diào)用

.

lua傳遞表給C++函數(shù)

lua_next3(L,3)

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

第一步注冊(cè)函數(shù):

lua_register(lua, "CTestTable", CTestTable);

第二步:

int CTestTable(lua_State* L)

{

std::cout << "int CTestTable" << std::endl;

std::map 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調(diào)用:

?結(jié)果:

lua調(diào)用C++ 獲取表中的內(nèi)容

lua_getfield(L,1,"name");

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

Lua調(diào)用C++參數(shù)類型檢查

luaL_checktype(L,1,LUA_TBOOLEAN);

if (lua_type(L, 1) != LUA_TBOOLEAN)

{

luaL_argerror(L,1,"bad argument");

}

第一行,一旦不匹配代碼就不會(huì)往下執(zhí)行,

第二行的不匹配還會(huì)往下執(zhí)行.

Lua調(diào)用C++ 返回值普通類型

第一步:注冊(cè)函數(shù):

lua_register(lua, "TestRe", TestRe);

第二步寫函數(shù):

int TestRe(lua_State* L)

{

lua_pushstring(L,"return value");

return 1;

}

一個(gè)返回參數(shù)就返回1,兩個(gè)就返回2

第三步lua代碼

結(jié)果:

lua返回表

第一步注冊(cè)函數(shù):

lua_register(lua, "TestReTable", TestReTable);

第二步寫注冊(cè)函數(shù)

int TestReTable(lua_State* L)

{

lua_newtable(L); // 創(chuàng)建一個(gè)表格,放在棧頂

lua_pushstring(L,"name"); // 壓入key

lua_pushstring(L,"ccname");//壓入value

lua_settable(L,-3); //彈出key value,并設(shè)置到表,表在棧頂了作為返回值

lua_pushstring(L, "age"); // 壓入key

lua_pushinteger(L, 21);//壓入value

lua_settable(L, -3); //彈出key value,并設(shè)置到表,表在棧頂了作為返回值

return 1;

}

第三步:lua

結(jié)果:

C++全部代碼:

#include

extern "C"

{

#include

#include

#include

}

#include

#include

#include

int CTest(lua_State* L) // 返回值是固定的int類型,返回0表示沒有返回參數(shù),返回1表示有一個(gè)返回參數(shù)

{

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 vStr;

std::cout << "int CTestArr" << std::endl;

int arraySize = luaL_len(L, 1); //獲取表的大小

for (int i = 1; i <= arraySize; ++i)

{

lua_pushnumber(L,i); //往棧中壓入一個(gè)數(shù)字,表示從數(shù)組中取那個(gè)下標(biāo)的值,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;

/* 讀取全部的表的內(nèi)容 */

std::map 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;

}

/* 只取一個(gè)

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); // 創(chuàng)建一個(gè)表格,放在棧頂

lua_pushstring(L,"name"); // 壓入key

lua_pushstring(L,"ccname");//壓入value

lua_settable(L,-3); //彈出key value,并設(shè)置到表,表在棧頂了作為返回值

lua_pushstring(L, "age"); // 壓入key

lua_pushinteger(L, 21);//壓入value

lua_settable(L, -3); //彈出key value,并設(shè)置到表,表在棧頂了作為返回值

return 1;

}

int main()

{

lua_State *lua = luaL_newstate();

luaopen_base(lua);

luaopen_string(lua);

lua_register(lua,"CTest",CTest); //第一個(gè)參數(shù)是lua狀態(tài)指針,第二個(gè)參數(shù)是函數(shù)名稱,第三個(gè)參數(shù)是lua函數(shù)指針,第二個(gè)參數(shù)和第三個(gè)參數(shù)可以用不同的名字,但第三個(gè)必須使用正確的函數(shù)指針

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"])

柚子快報(bào)邀請(qǐng)碼778899分享:開發(fā)語言 lua調(diào)用C++函數(shù)

http://yzkb.51969.com/

相關(guān)文章

評(píng)論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/18683960.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問

文章目錄