Lua中調(diào)用C++函數(shù)示例
Lua當(dāng)然也能夠調(diào)用C中定義的函數(shù)。一個(gè)平均數(shù)的例子,解釋一下。
下面給出的C++函數(shù)average()演示了如何接受多個(gè)參數(shù)且返回超過一個(gè)值。
1.lua_gettop函數(shù)返回棧頂?shù)乃饕?。因?yàn)樵贚ua中棧是從1開始編號的,因此該函數(shù)獲得的值就是參數(shù)的個(gè)數(shù)。
2.在for循環(huán)中計(jì)算所有參數(shù)之和。
3.調(diào)用lua_pushnumber()將參數(shù)的平均值壓棧。
4.最后,函數(shù)返回1,說明有一個(gè)返回值在棧中。
現(xiàn)在C++函數(shù)已經(jīng)被定義好了,我們必須將它告訴Lua解釋器。這將在main函數(shù)中初始化Lua解釋器和載入庫完成之后完成注冊函數(shù):
lua_register(L, "avg", average); //第二參數(shù)為Lua中調(diào)用的函數(shù)名
C++端:
#include "stdafx.h" #include<stdio.h> extern "C" { //如不用extern會出現(xiàn)連接錯(cuò)誤,編譯成了C++文件 #include <lua.h> #include <lualib.h> #include <lauxlib.h> } int average(lua_State *L){ int n= lua_gettop(L); int i; double sum=0; for(i=0;i<n;i++){ sum+=lua_tonumber(L,-1); lua_pop(L,1); } lua_pushnumber(L,sum/n); if(!lua_isnumber(L,-1)) luaL_error(L,"push error!\n"); return 1; } int _tmain(int argc, _TCHAR* argv[]) { lua_State* L = lua_open(); luaL_openlibs(L); //新版本庫添加的方法 lua_register(L,"avg",average); luaL_dofile(L,"cof.lua"); getchar(); return 0; }
Lua文件:
print("avg is ",avg(1,2,3,4,5,6,7,8))
運(yùn)行程序即可實(shí)現(xiàn)求平均數(shù)的功能
相關(guān)文章
Lua中基本的數(shù)據(jù)類型、表達(dá)式與流程控制語句講解
這篇文章主要介紹了Lua中基本的數(shù)據(jù)類型、表達(dá)式與流程控制語句講解,總結(jié)了Lua入門學(xué)習(xí)中的基礎(chǔ)語法知識,需要的朋友可以參考下2016-06-06Lua中實(shí)現(xiàn)StringBuffer功能
這篇文章主要介紹了Lua中實(shí)現(xiàn)StringBuffer功能,本文給出了實(shí)現(xiàn)代碼和調(diào)用代碼,需要的朋友可以參考下2014-11-11讓你的python代碼更加pythonic(簡練、明確、優(yōu)雅)
這篇文章主要介紹了讓你的python代碼更加pythonic(簡練、明確、優(yōu)雅),本文講解的是一種讓代碼更加清晰、簡練、明確、優(yōu)雅的書寫方法,需要的朋友可以參考下2014-10-10Lua的編譯、執(zhí)行和調(diào)試技術(shù)介紹
這篇文章主要介紹了Lua的編譯、執(zhí)行和調(diào)試技術(shù)介紹,本文著重講解了對錯(cuò)誤的處理,另外也講解了編譯和執(zhí)行等知識,需要的朋友可以參考下2015-04-04