Lua と C 言語は相互に呼び出します
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チュートリアルに興味のある方の参考になれば幸いです。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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

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