你下一秒干什么,算法都知道

Lua可以调用C函数的能力将极大的提高Lua的可扩展性和可用性。

对于有些和操作系统相关的功能,或者是对效率要求较高的模块,我们完全可以通过C函数来实现,之后再通过Lua调用指定的C函数。

对于那些可被Lua调用的C函数而言,其接口必须遵循Lua要求的形式,即typedef int (*lua_CFunction)(lua_State* L)。

简单说明一下,该函数类型仅仅包含一个表示Lua环境的指针作为其唯一的参数,实现者可以通过该指针进一步获取Lua代码中实际传入的参数。返回值是整型,表示该C函数将返回给Lua代码的返回值数量,如果没有返回值,则return 0即可。需要说明的是,C函数无法直接将真正的返回值返回给Lua代码,而是通过虚拟栈来传递Lua代码和C函数之间的调用参数和返回值的。

实例代码:

// testlua.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <math.h>

extern "C"
{
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
}

//待Lua调用的C注册函数
static int add2(lua_State* L)
{
	//检查栈中的参数是否合法,1表示Lua调用时的第一个参数(从左到右),依此类推。
	//如果Lua代码在调用时传递的参数不为number,该函数将报错并终止程序的执行。
	double op1 = luaL_checknumber(L,1);
	double op2 = luaL_checknumber(L,2);
	//将函数的结果压入栈中。如果有多个返回值,可以在这里多次压入栈中。
	lua_pushnumber(L,op1 + op2);
	//返回值用于提示该C函数的返回值数量,即压入栈中的返回值数量。
	return 1;
}

//待Lua调用的C注册函数。
static int sub2(lua_State* L)
{
	double op1 = luaL_checknumber(L,1);
	double op2 = luaL_checknumber(L,2);
	lua_pushnumber(L,op1 - op2);
	return 1;
}

//待Lua调用的C注册函数。
static int l_sin (lua_State *L) {
	double d = lua_tonumber(L, 1); /* get argument */
	lua_pushnumber(L, sin(d)); /* push result */
	return 1; /* number of results */
}

int _tmain(int argc, _TCHAR* argv[])
{
	lua_State *L = luaL_newstate();
	luaL_openlibs(L);

	//将指定的函数注册为Lua的全局函数变量,其中第一个字符串参数为Lua代码
	//在调用C函数时使用的全局函数名,第二个参数为实际C函数的指针。
	lua_register(L, "add2", add2);
	lua_register(L, "sub2", sub2);
	lua_register(L, "l_sin", l_sin);
	//在注册完所有的C函数之后,即可在Lua的代码块中使用这些已经注册的C函数了。
	luaL_dofile(L,"test.lua");

	//if (luaL_dostring(L,testfunc))
	// printf("Failed to invoke.\n");

	//const char *buf = "print(‘Hello World‘)";
	//luaL_dostring(L,buf);

	lua_close(L);
	return 0;
}

test.lua

function show()
    print("helloworld")
    print(add2(1.0,2.0))
    print(sub2(20.1,19))
    print(l_sin(1))
end  

show()  

运行结果:

引用博文:http://www.cnblogs.com/stephen-liu74/archive/2012/07/23/2469902.html

你下一秒干什么,算法都知道,布布扣,bubuko.com

时间: 2024-12-26 06:10:32

你下一秒干什么,算法都知道的相关文章

这一秒不放弃下一秒就有希望

不知不觉来到兄弟连三个多月了,原来才发现时间过的那么快,当初的我们热血澎湃的来到这里,当初的我们怀着激情,怀着热情,怀着......还有很多不知道的情愫来到这里,现在的我们一直都在坚持,都是为了一个共同目标.      现在的我们是否跟当初的自己差别很大,现在的我们是否改变了很多,现在的我们是否为了自己以前的决定而后悔,现在的我们......,如果你后悔了,如果你没有改变,如果你.......那你等于没有来到这里,为什么受的是同样苦,得到的结果却不一样,不是你有基础,你就可以不学,不是你有基础,

Linux下实现秒级定时任务的两种方案

Linux下实现秒级定时任务的两种方案(Crontab 每秒运行): 第一种方案,当然是写一个后台运行的脚本一直循环,然后每次循环sleep一段时间. while true ;do command sleep XX //间隔秒数 done 第二种方案,使用crontab. 我们都知道crontab的粒度最小是到分钟,但是我们还是可以通过变通的方法做到隔多少秒运行一次. 以下方法将每20秒执行一次 crontab -e * * * * * /bin/date* * * * * sleep 20;

网络流最经典的入门题 各种网络算法都能AC。

Drainage Ditches 题目抽象:给你m条边u,v,c.   n个定点,源点1,汇点n.求最大流.  最好的入门题,各种算法都可以拿来练习 (1):  一般增广路算法  ford() 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <string&g

HMM条件下的 前向算法 和 维特比解码

一.隐马尔科夫HMM假设: 有且只有3种天气:0晴天,1阴天,2雨天 各种天气间的隔天转化概率mp: mp[3][3] 晴天 阴天 雨天 晴天 0.33333 0.33333 0.33333 阴天 0.33333 0.33333 0.33333 雨天 0.33333 0.33333 0.33333 有2种活动:            0去公园,1不去公园 各种天气下进行各种活动的概率: w2a[3][2] 去公园 不去公园 晴天 0.75 0.25 阴天 0.4 0.6 雨天 0.25 0.75

python3 格式化输出给定时间的下一秒

# 功能:输入一个时间,格式化输出该时间的下一秒 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Hiuhung Wan # 功能:输入一个时间,格式化输出该时间的下一秒 def main(): time_input = input("请输入一个时间格式的字符串") if input_check(time_input): print(next_sec(time_input)) else: print('输入不符合要求,格式为:

python 下的数据结构与算法---1:让一切从无关开始

我也忘了大概多久了,好像是三周多一点,终于把Data Structure and Algorithms with python以及 Problem Solving with  Algorithms and DataStructures看完了(图那部分没仔细看,太难太费时间,毕业设计开始了,有点忙).[github地址,包含了那两本书带笔记版以及下面零的代码] 所以啦,这作为第一篇总结笔记就从点无关的开始吧(也就是这两本书中提到的python相关但是与数据结构和算法无关的东东) 目录: 零:有些什

加密算法在linux下相同输入每次加密结果都不同的问题

现象描述:在 windows 操作系统下加解密正常,但部署到 linux 环境中相同的输入加密结果不正确,并且每次运行返回的结果都不同. 通过排查,发现问题出现在SecureRandom参数上面. 之前代码使用的是new SecureRandom(byte[]),由于SecureRandom调用内核底层的RNG实现不同(或第一实现不同),导致windows与linux中出现结果差异. 修改后代码: KeyGenerator kgen = KeyGenerator.getInstance(algo

linux kernel态下使用NEON对算法进行加速

ARM处理器从cortex系列开始集成NEON处理单元,该单元可以简单理解为协处理器,专门为矩阵运算等算法设计,特别适用于图像.视频.音频处理等场景,应用也很广泛. 本文先对NEON处理单元进行简要介绍,然后介绍如何在内核态下使用NEON,最后列举实例说明. 一.NEON简介 其实最好的资料就是官方文档,Cortex?-A Series Programmer's Guide ,以下描述摘自该文档 1.1 SIMD NEON采用SIMD架构,single instruction multy dat

python 下的数据结构与算法---6:6大排序算法

一:冒泡排序(Bubble Sort) 原理:假设有n个数,第一轮时:从第一个元素开始,与相邻的元素比较,如果前面的元素小就交换,直到第n-1个元素时,这样的结果是将最大的元素放到了最后,同理,第二轮还是从第一个元素开始比较,直到第n-2个元素,这样能够把剩下的n-1个数中的最大的数放到第n-1的位置,一直这样进行n-1轮就能够完成排序. 1 def Bublesort(seq): 2 i = 0 3 j = 0 4 while i < len(seq): 5 while j < len(se