ホームページ バックエンド開発 PHPチュートリアル Lua と C 言語は相互に呼び出します

Lua と C 言語は相互に呼び出します

Aug 08, 2016 am 09:23 AM
include lua printf quot

lua と C 言語の間の多くの相互変調が lua-nginx-module に表示されます。ここでは、「Lua プログラミング」の第 24 章から第 27 章にあるテスト コードをいくつか紹介します。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include <stdarg.h>
#include <stdlib.h>

#define MAX_COLOR 255

static void stackDump(lua_State *L);

static int l_split(lua_State *L)
{
	const char *s = luaL_checkstring(L, 1);
	const char *sep = luaL_checkstring(L, 2);
	const char *e;
	int i = 1;
	
	lua_newtable(L);
	
	while ((e = strchr(s, *sep)) != NULL)
	{
		lua_pushlstring(L, s, e-s);
		lua_rawseti(L, -2, i ++);
		s = e + 1;
	}
	
	lua_pushstring(L, s);
	lua_rawseti(L, -2, i);
	
	return 1;
}

int l_map(lua_State *L)
{
	int i, n;
	luaL_checktype(L, 1, LUA_TTABLE);
	luaL_checktype(L, 2, LUA_TFUNCTION);
	
	n = lua_objlen(L, 1);
	for (i = 1; i <= n; i ++)
	{
		//stackDump(L);
		//printf("=====1=====\n");
		lua_pushvalue(L, 2);
		//stackDump(L);
		//printf("=====2=====\n");
		lua_rawgeti(L, 1, i);
		//stackDump(L);
		//printf("=====3=====\n");
		lua_call(L, 1, 1);
		//stackDump(L);
		//printf("=====4=====\n");
		lua_rawseti(L, 1, i);
		//stackDump(L);
		//printf("=====5=====\n");
	}
	
	return 0;
}

// 通过Lua调用的c函数,通过打印栈说明每个函数有独立的栈
// 将c函数注册到lua中,从而被lua调用。
static int l_sin(lua_State *L)
{
	double d = lua_tonumber(L, 1);
	lua_pushnumber(L, sin(d));
	
	// stackDump(L);
	// printf("====l_sin===\n");
	
	return 1;
}

// c 调用lua 函数
// 从Lua中得到函数,在c语言中传入参数。
double f(lua_State *L,double x, double y)
{
	double z;
	lua_getglobal(L, "f");
	lua_pushnumber(L, x);
	lua_pushnumber(L, y);
	// table function 1.1 2.2 说明c语言调用Lua会共享相同的栈.
	// stackDump(L);
	// printf("=====f=====\n");
	
	if (lua_pcall(L, 2, 1, 0) != 0)
		printf("call f error\n");
	
	if (!lua_isnumber(L, -1))
		printf("function f must return a number\n");
	
	z = lua_tonumber(L, -1);
	lua_pop(L, 1);
	return z;
}

int getfield(lua_State *L, const char *key)
{
	int result;
	// stackDump(L);
	// printf("==1==\n");
	lua_getfield(L, -1, key);
	// stackDump(L);
	// printf("==2==\n");
	if (!lua_isnumber(L, -1))
		printf("invalid component\n");
	result = lua_tonumber(L, -1);
	lua_pop(L, 1);
	// stackDump(L);
	// printf("==4==\n");
	return result;
}

static void stackDump(lua_State *L)
{
	int i;
	int top = lua_gettop(L);
	for (i = 1; i <= top; ++ i)
	{
		int t = lua_type(L, i);
		switch(t) {
		case LUA_TSTRING:
			printf("'%s'", lua_tostring(L, i));
			break;
		case LUA_TBOOLEAN:
			printf(lua_toboolean(L, i) ? "true" : "false");
			break;
		case LUA_TNUMBER:
			printf("%g", lua_tonumber(L, i));
			break;
		default:
			printf("%s", lua_typename(L, t));
			break;
		}
		printf(" ");
	}
	printf("\n");
}

void load(lua_State *L, const char *fname, int *w, int *h) {
	if (luaL_loadfile(L, fname) || lua_pcall(L, 0, 0, 0))
			printf("cannot run config.file\n");
	
	/*lua_getglobal(L, "height");
	lua_getglobal(L, "width");
	
	if (!lua_isnumber(L, -2))
		printf("width should be a number\n");
	
	if (!lua_isnumber(L, -1))
		printf("height should be a number\n");
	
	*w = lua_tointeger(L, -2);
	*h = lua_tointeger(L, -1);*/
	
	lua_getglobal(L, "table");
	
	if (!lua_istable(L, -1))
		printf("background should be table\n");
	
	printf("%f\n", f(L, 1.1, 2.2));
	
	float red = getfield(L, "r");
	float green = getfield(L, "g");
	float blue = getfield(L, "b");
	
	printf("%f, %f, %f\n", red, green, blue);
}

// lua 调用c代码可以模仿这里的格式
const char* testfunc = "t = mysplit(\"hi, hello\", \",\"); print(t[1], t[2])";

int main(void)
{
	char buff[256];
	int error;
	lua_State *L = luaL_newstate();
	luaL_openlibs(L);
	int w, h;
	// load(L, "test.lua", &w, &h);
	
	lua_pushcfunction(L, l_sin);
	lua_setglobal(L, "mysin");
	
	lua_pushcfunction(L, l_map);
	lua_setglobal(L, "mymap");
	
	lua_pushcfunction(L, l_split);
	lua_setglobal(L, "mysplit");
	
	if (luaL_dostring(L, testfunc))
		fprintf(stderr, "%s", lua_tostring(L, -1));
	
	/*
	while (fgets(buff, sizeof(buff), stdin) != NULL)
	{
		error = luaL_loadbuffer(L, buff, strlen(buff), "line");
		stackDump(L);
		error = error || lua_pcall(L, 0, 0, 0);
		stackDump(L);
	}
	
	if (error) {
		fprintf(stderr, "%s", lua_tostring(L, -1));
		lua_pop(L, 1);
	}*/
	
	lua_close(L);
	return 0;
}
ログイン後にコピー

test.lua

BULE = {r = 0, g = 0, b = 1}
table = {["r"] = 10, ["g"] = 23, ["b"] = 33}

function f(x, y)
	return x + y
end
ログイン後にコピー

コンパイル: gcc test.c -I/usr/local/include/luajit-2.0 -llua-5.1 -lm

以上、LuaとC言語の相互呼び出しについて内容も含めて紹介しましたが、PHPチュートリアルに興味のある方の参考になれば幸いです。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Nginx の Lua サポートをインストールして構成する方法 Nginx の Lua サポートをインストールして構成する方法 Jun 02, 2023 pm 10:01 PM

Nginx のインストールと設定 Lua のサポート デフォルトでは、Nginx は Lua モジュールをサポートしていません。LuaJIT インタープリターをインストールして Nginx を再コンパイルする必要があります。または、中国人が開発した openrestry に必要なモジュール (LuaJIT、Ngx_devel、lua-nginx-module1) を使用することもできます。 . 環境準備 [root @nginx_lua~]#yuminstall-ygccgcc-c++makepcre-develzlib-developenssl-devel2. 最新の luajit と ngx_devel_kit と lua-nginx-module の解凍をダウンロード [r

nginx と lua を統合して mysql を操作する方法 nginx と lua を統合して mysql を操作する方法 May 16, 2023 pm 10:43 PM

実装アイデアは、nginx でブラックリストを直接構成し、論理ブロックを作成して実装する、サーバー (Java) にフィルターを作成し、フィルター内のインターセプターを統合する、サーバー (Java) にインターセプターを作成してインターセプターを統合する、です。 ; ここに 3 つの実装アイデアがあります。実装ソリューションについては、他にもあるかもしれませんが、よく考えてみると、nginx で論理ブロックを書くのは多くの人が得意なことではないようです。コード レベルですが、これは第一に、同時実行性が高いビジネスのピーク時には、バックエンド サービスに大きな負荷がかかることは避けられません。これが lua の意味です。つまり、nginx は lua を統合できるため、nginx はゲートウェイとして機能し、同時にプロキシ サーバーとしても機能します。

Vue.js と Lua 言語の統合による軽量の組み込みアプリケーションの作成 Vue.js と Lua 言語の統合による軽量の組み込みアプリケーションの作成 Jul 31, 2023 pm 02:23 PM

軽量の組み込みアプリケーションを作成するための Vue.js と Lua 言語の統合現代の開発では、フロントエンド フレームワーク Vue.js とスクリプト言語 Lua はそれぞれ幅広い用途に使用されています。 Vue.js はユーザー インターフェイスを構築するための進歩的なフレームワークであり、Lua は組み込みアプリケーションやゲーム開発によく使用される軽量のスクリプト言語です。この記事では、Vue.js を Lua 言語と統合して軽量の組み込みアプリケーションを作成する方法を紹介し、コード例を示します。まず、Vue.jをインストールする必要があります

php include と include_once の違いは何ですか php include と include_once の違いは何ですか Mar 22, 2023 am 10:38 AM

PHP を使用して Web ページを作成する場合、他の PHP ファイルのコードを現在の PHP ファイルに含める必要がある場合があります。現時点では、include 関数または include_once 関数を使用してファイルのインクルードを実装できます。では、include と include_once の違いは何でしょうか?

Vue.js と Lua 言語の統合、ゲーム開発用のフロントエンド エンジン構築におけるベスト プラクティスと経験の共有 Vue.js と Lua 言語の統合、ゲーム開発用のフロントエンド エンジン構築におけるベスト プラクティスと経験の共有 Aug 01, 2023 pm 08:14 PM

Vue.js と Lua 言語の統合、ゲーム開発用のフロントエンド エンジンを構築するためのベスト プラクティスと経験の共有 はじめに: ゲーム開発の継続的な開発に伴い、ゲーム フロントエンド エンジンの選択は重要な決定となっています。これらの選択肢の中で、Vue.js フレームワークと Lua 言語が多くの開発者の注目を集めています。人気のフロントエンド フレームワークとして、Vue.js は豊富なエコシステムと便利な開発方法を備えていますが、Lua 言語は軽量で効率的なパフォーマンスのため、ゲーム開発で広く使用されています。この記事では、その方法について説明します。

Javaエコシステム/RedisでLuaスクリプトを使用する方法 Javaエコシステム/RedisでLuaスクリプトを使用する方法 Jun 02, 2023 pm 10:41 PM

1. LUA のインストール Mac への LUA のインストールは非常に簡単で、brew 関連コマンドを直接使用するだけです; brewinstalllua は lua-v コマンドを使用して lua がインストールされていることを確認します。 1) test.lua ファイルを作成するための簡単な使用方法。内容は次のとおりです。 コマンドを実行します。 luatest.lua 出力は次のとおりです。 2. lua 構文の概要 Lua は対話型プログラミングとスクリプト化プログラミングを提供します。 対話型プログラミング: コマンド ラインに構文を直接入力します。 、すぐに実行して実行効果を確認できます。スクリプティングはプログラミングです。スクリプト ファイルを作成して実行します。 1. Comment Lua は 2 つのコメント方法を提供します: 単一行コメントと複数行コメント 1) 単一行コメントは 2 つのマイナス記号を使用します。--2) 複数行コメント--[[複数行コメント 複数行

Redis+Lua スクリプトを使用してカウンター インターフェイスのアンチスワイプ機能を実装する方法 Redis+Lua スクリプトを使用してカウンター インターフェイスのアンチスワイプ機能を実装する方法 May 28, 2023 pm 11:32 PM

[実装プロセス] 1. 問題分析 set コマンドを設定しているが、有効期限を設定するときに、ネットワークのジッターなどの理由で設定が成功しない場合、デッド カウンタ (デッドロックに似た) が表示されます。解決策 Redis+Lua 良い解決策です スクリプトを使用してsetコマンドとexpiredコマンドを連携させ、Redisが干渉されずに実行されるようにします これにより、アトミックな操作がかなりの程度保証されます なぜ保証されると言われるのか完全ではなく、かなりの範囲でアトミックな操作を保証しますか? Redis が内部で実行されると問題が発生する可能性がありますが、その確率は非常に小さいため、確率が低いイベントであっても、デッドロックを解決するなどの対応する解決策があります。に保管される

idaPro がアプリ復号化 lua スクリプトを分析する方法 idaPro がアプリ復号化 lua スクリプトを分析する方法 May 18, 2023 am 08:34 AM

前の idaPro デバッグまたはフックを通じて、xxtea 復号化キーを取得できます。署名の場合は、元のファイルを直接開くことができます。署名値: byds を確認できます。したがって、xxtea 復号化ツール (GitHub のソース コードからコンパイル可能) を使用して復号化を試みることができます。 xxtea による復号後の lua スクリプトはまだプレーンテキストではありません。以前、cocos2d フレームワークのソース コードとマスター APK のデコード結果に基づいて xxtea 暗号化が使用されていると判断し、アプリの Lua スクリプトにも署名値があり、それが xxtea 暗号化方式であることを確認しましたが、

See all articles