俺老刘终于可以将指针传递给lua了!
发布日期:2021-06-29 18:53:08 浏览次数:2 分类:技术文章

本文共 4997 字,大约阅读时间需要 16 分钟。

文章目录

俺老孙终于可以将指针传递给lua了!

  • 希望把指针传给lua
  • 但是lua拿到了它
  • 还要通过这个指针去访问他指向的东西
  • 那咋办

  • 首先,是用lua_pushlightuserdata(L,&a);将指针传给lua

  • 老子不想说了哈哈

g++ -I /home/ztz123/Desktop/lua-5.4.0/src -L /home/ztz123/Desktop/lua-5.4.0/src A.cpp -llua -ldl

#include 
extern "C" {
#include "lua.h"#include "lualib.h"#include "lauxlib.h"}typedef struct haha{
int a;int b;}haha;/* 指向lua解释器的指针 */lua_State* L;static int average(lua_State *L){
haha *a = (haha *)lua_topointer(L,-1); printf("%d\n",a->a); return 0;}int main ( int argc, char *argv[] ){
/* 初始化Lua */ L = luaL_newstate(); /* 载入Lua基本库 */ luaL_openlibs(L); /* 注册自定义函数 */ lua_register(L, "average", average); luaL_loadfile(L,"avg.lua"); haha a={
23,89};lua_pcall(L,0,0,0); //居然特么的还必须要有这句话!! lua_getglobal(L, "func1"); lua_pushlightuserdata(L,&a); lua_pcall(L, 1, 0, 0); /* 执行avg.lua文件 */ luaL_dofile(L, "avg.lua"); /* 关闭Lua */ lua_close(L); /* 暂停 */ printf( "Press enter to exit..." ); getchar(); return 0;}

  • avg.lua长这样子
function func1(a)print("esfs")average(a)end

如果有两个参数怎么bane?

  • 你必须记住最右边的参数是-1
  • 往左依次是-2,-3

还有就是我发现lua_topointer(L,-2);

int aa = lua_tonumber居然不自动弹出栈啊!!!很神奇吧。难道是函数结束它自动弹掉吗?

#include 
extern "C" {
#include "lua.h"#include "lualib.h"#include "lauxlib.h"}typedef struct haha{
int a;int b;}haha;/* 指向lua解释器的指针 */lua_State* L;static int average(lua_State *L){
haha *a = (haha *)lua_topointer(L,-2); int aa = lua_tonumber(L,-1); printf("%d\n",a->a); printf("%d\n",aa); return 0;}int main ( int argc, char *argv[] ){
/* 初始化Lua */ L = luaL_newstate(); /* 载入Lua基本库 */ luaL_openlibs(L); /* 注册自定义函数 */ lua_register(L, "average", average); luaL_loadfile(L,"avg.lua"); haha a={
23,89};lua_pcall(L,0,0,0); lua_getglobal(L, "func1"); lua_pushlightuserdata(L,&a); lua_pcall(L, 1, 0, 0); /* 执行avg.lua文件 */ luaL_dofile(L, "avg.lua"); /* 关闭Lua */ lua_close(L); /* 暂停 */ printf( "Press enter to exit..." ); getchar(); return 0;}
function func1(a)print("esfs")average(a,12)end

自己传参给lua的时候要记得从左到右传参啊

#include 
extern "C" {
#include "lua.h"#include "lualib.h"#include "lauxlib.h"}typedef struct haha{
int a;int b;}haha;/* 指向lua解释器的指针 */lua_State* L;static int average(lua_State *L){
haha *a = (haha *)lua_topointer(L,-2); int aa = lua_tonumber(L,-1); printf("%d\n",a->a); printf("%d\n",aa); return 0;}int main ( int argc, char *argv[] ){
/* 初始化Lua */ L = luaL_newstate(); /* 载入Lua基本库 */ luaL_openlibs(L); /* 注册自定义函数 */ lua_register(L, "average", average); luaL_loadfile(L,"avg.lua"); haha a={
23,89};lua_pcall(L,0,0,0); lua_getglobal(L, "func1"); lua_pushlightuserdata(L,&a); lua_pushnumber(L,88); lua_pcall(L, 2, 0, 0); /* 执行avg.lua文件 */ luaL_dofile(L, "avg.lua"); /* 关闭Lua */ lua_close(L); /* 暂停 */ printf( "Press enter to exit..." ); getchar(); return 0;}
function func1(a,b)print("esfs")average(a,b)end

double数也用pushnumber传递啊

#include 
extern "C" {
#include "lua.h"#include "lualib.h"#include "lauxlib.h"}typedef struct haha{
int a;int b;}haha;/* 指向lua解释器的指针 */lua_State* L;static int average(lua_State *L){
haha *a = (haha *)lua_topointer(L,-2); double aa = lua_tonumber(L,-1); printf("%d\n",a->a); printf("%9f\n",aa); return 0;}int main ( int argc, char *argv[] ){
/* 初始化Lua */ L = luaL_newstate(); /* 载入Lua基本库 */ luaL_openlibs(L); /* 注册自定义函数 */ lua_register(L, "average", average); luaL_loadfile(L,"avg.lua"); haha a={
23,89};lua_pcall(L,0,0,0); lua_getglobal(L, "func1"); lua_pushlightuserdata(L,&a); lua_pushnumber(L,34.567999); lua_pcall(L, 2, 0, 0); /* 执行avg.lua文件 */ luaL_dofile(L, "avg.lua"); /* 关闭Lua */ lua_close(L); /* 暂停 */ printf( "Press enter to exit..." ); getchar(); return 0;}
function func1(a,b)print("esfs")average(a,b)print(type(78)) end

如何获取返回值

#include 
extern "C" {
#include "lua.h"#include "lualib.h"#include "lauxlib.h"}typedef struct haha{
int a;int b;}haha;/* 指向lua解释器的指针 */lua_State* L;static int average(lua_State *L){
haha *a = (haha *)lua_topointer(L,-2); double aa = lua_tonumber(L,-1); //printf("%d\n",a->a); printf("%9f\n",aa); return 0;}int main ( int argc, char *argv[] ){
/* 初始化Lua */ L = luaL_newstate(); /* 载入Lua基本库 */ luaL_openlibs(L); /* 注册自定义函数 */ lua_register(L, "average", average); luaL_loadfile(L,"avg.lua"); haha a={
23,89};lua_pcall(L,0,0,0); lua_getglobal(L, "func1"); lua_pushlightuserdata(L,&a); lua_pushnumber(L,34.567999); lua_pcall(L, 2, 2,0); double result = lua_tonumber(L,-2); printf("jieguoshi: %5f\n",result); /* 执行avg.lua文件 */ luaL_dofile(L, "avg.lua"); /* 关闭Lua */ lua_close(L); /* 暂停 */ printf( "Press enter to exit..." ); getchar(); return 0;}
function func1(a,b)print("esfs")average(a,b)print(type(78)) return b,bend

转载地址:https://cyj666.blog.csdn.net/article/details/108279087 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:11 散列表
下一篇:猿谋人问我两个矩形重叠面积

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月13日 07时05分32秒