C API
--[[1. C API中的大部分函數并不檢查他們參數的正確性,你需要在調用前確保參數的準確。2. Lua 中的字符串不是以零為結束符的,他們依賴于一個明確的長度,因此可以包含任意的二進制數據。--Lua_string結尾總是零,但中間也可能包含零。3. 無論你何時壓入一個元素到棧上,你有責任確保在棧上有空間來做這件事情。int lua_checkstack(lua_State *L, int sz);4. 永遠不要將指向Lua字符串的指針保存到訪問他們的外部函數中。]]
[[壓入元素
]]
lua_pushnil, lua_pushnumber, lua_pushboolean,
任意的字符串(char* 類型,允許包含'\0'字符)用lua_pushlstring
C語言風格(以'\0'結束)的字符串(const char*)用lua_pushstring
--void lua_pushnil(lua_State *L)
--void lua_pushboolean(lua_State *L, int bool)
--void lua_pushnumber(lua_State *L, double n)
--void lua_pushlstring(lua_State *L, const char *s, size_t length)
--void lua_puthstring(lua_State *L, const char *s)[[查詢元素
]]
API用索引來訪問棧中的元素。在棧中第一個被壓入棧的元素索引為1,下一個為2,
也可以用負索引,-1指出棧頂元素。
--lua_tostring(L, -1)以字符串的形式返回棧頂的值int lua_is...(lua_State *L, int index)--是對應類型返回1,否則0
檢查一個元素是否是指定的類型,...可以是任何Lua類型。lua_isnumber和lua_isstring函數
不檢查這個值是否是指定的類型,而是看它是否能被轉換成指定的那種類型。lua_type函數返回棧中元素的類型:LUA_TNIT/LUA_TBOOLEAN/LUA_TNUMBER/LUA_TSTRING/LUA_TTABLE
/LUA_TFUNCTION/LUA_TUSERDATE/LUA_TTHREAD[[
lua_to函數
]] 如果給定的元素的類型不正確,lua_toboolean、lua_tonumber和lua_strlen返回0,其它函數返回NULL。 --int lua_toboolean(lua_State *L, int index) --double lua_tonumber(lua_State *L, int index) --const char* lua_tostring(lua_State *L, int index) --size_t lua_strlen(lua_State *L, int index)[[其它堆棧操作 ]] --int lua_gettop(lua_State *L) --void lua_settop(lua_State *L, int index) --void lua_pushvalue(lus_State *L, int index) --void lua_remove(lua_State *L, int index) --void lua_insert(lua_State *L, int index) --void lua_replace(lua_State *L, int index) 函數lua_gettop返回堆棧中的元素個數,它也是棧頂元素的索引。 從棧頂中彈窗n個元素:lua_settop(L, -(n)-1) lua_pushvalue: 壓入堆棧上指定索引的一個拷貝到棧頂; lua_remove: 移除指定索引位置的元素,并將其上元素下移 lua_insert: 移動棧頂元素到指定位置,并將上面的元素上移 lua_replace: 從棧頂彈出元素值并將其設置到指定索引位置,沒有任何移動操作
lua_to函數
]] 如果給定的元素的類型不正確,lua_toboolean、lua_tonumber和lua_strlen返回0,其它函數返回NULL。 --int lua_toboolean(lua_State *L, int index) --double lua_tonumber(lua_State *L, int index) --const char* lua_tostring(lua_State *L, int index) --size_t lua_strlen(lua_State *L, int index)[[其它堆棧操作 ]] --int lua_gettop(lua_State *L) --void lua_settop(lua_State *L, int index) --void lua_pushvalue(lus_State *L, int index) --void lua_remove(lua_State *L, int index) --void lua_insert(lua_State *L, int index) --void lua_replace(lua_State *L, int index) 函數lua_gettop返回堆棧中的元素個數,它也是棧頂元素的索引。 從棧頂中彈窗n個元素:lua_settop(L, -(n)-1) lua_pushvalue: 壓入堆棧上指定索引的一個拷貝到棧頂; lua_remove: 移除指定索引位置的元素,并將其上元素下移 lua_insert: 移動棧頂元素到指定位置,并將上面的元素上移 lua_replace: 從棧頂彈出元素值并將其設置到指定索引位置,沒有任何移動操作
程序:
#include <stdio.h> #include <string> #include "call_va.h" #include "LuaTestAPI.h"extern "C" { #include <lua.h> #include <lauxlib.h> #include <lualib.h> } #pragma comment(lib, "lua5.1.lib")int main(void) {char buff[256];lua_State *L = lua_open();luaL_openlibs(L);initAPI(L);if(luaL_dofile(L, "test.lua") == 0){//調用lua函數,在lua中將調用LuaTestAPI中的gotoxylua_getglobal(L, "Run");lua_pushnumber(L, 20);lua_pushnumber(L, 10);lua_pushnumber(L, 1111);//額外傳入一個值lua_pop(L, 1); //彈窗額外傳入的值lua_pushstring(L, "Test");if(lua_pcall(L, 3, 3, 0)!= 0){const char* strError = lua_tostring(L, -1);printf("%s", strError);return -1;}//lua中的返回:return "result", 10, {name = "Mical", age = 12}//讀取返回值if(lua_isstring(L, 1) && lua_isnumber(L, 2) && lua_istable(L, 3)){const char* str = lua_tostring(L, 1);int num = lua_tonumber(L, 2);lua_getfield(L, 3, "name");lua_getfield(L, 3, "age");const char* name = lua_tostring(L, 4);int age = lua_tonumber(L, 5);printf("return_1:%s\n", str);printf("return_2:%d\n", num);printf("return_3_name:%s\n", name);printf("return_3_age:%d\n", age);}lua_close(L);} }lua代碼:
function Run(x, y, val)GotoXY(x, y)Test1.put(val)return "result", 10, {name = "Mical", age = 12} endC中gotoxy代碼:
#include<windows.h> #include "LuaTestAPI.h"int gotoxy(lua_State *L) {int x = luaL_checknumber(L, 1);int y = luaL_checknumber(L, 2);COORD coord={x,y};SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);return 1; }void initAPI(lua_State *L) {lua_register(L, "GotoXY", gotoxy); }?
轉載于:https://www.cnblogs.com/wrbxdj/p/CAPI.html
總結
- 上一篇: eclipse报错:Failed to
- 下一篇: 直接取HANA数据库数据,动态QUERY