call_Lua 似非モジュール

2017-04-14 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
先日(2017-04-10)の記事「GSL Shell と Lua で、プロセス間通信」では、
PIPE 2本を使って、EVENT は使わない方式の
プロセス間通信方式を確立した???

でも、やはり Lua を C言語等から直接利用したい。

つまり、
Lua から Python を呼び出す「LuaPy モジュール」の様なモノ


それには、どうすれば良いか???

検索して見たら、
Qiita の「C と lua の連携方法メモ
が見つかった。
  ・・・・・
  ・・・・・
  C から lua の関数呼び出し
  下記の lua 関数を C から呼び出す.
----- func.lua
function func(arg1, arg2)
print(arg1)
print(arg2)
return arg1+1, arg2+2
end
上記を呼び出す C のコード
//=== call.cpp
lua_State* l = luaL_newstate();
luaL_openlibs(l);
luaL_loadfile(l, "func.lua");
lua_pcall(l, 0, 0, 0); // script を実行しておかないと関数を呼び出せない
lua_getglobal(l, "func"); // 呼び出す関数
lua_pushnumber(l, 4); // 第一引数
lua_pushnumber(l, 5); // 第ニ引数
if (lua_pcall(l, 2, 2, 0)) { // 引数 2 個, 戻り値 2 個
fprintf(stderr, "cannot exec add. %s\n", lua_tostring(l, -1));
return;
}
if (lua_isnumber(l, -1)) {
int ret = lua_tointeger(l, -1); // 戻り値その 1
printf("ret=%d\n", ret);
}
lua_pop(l, 1); // 戻り値を pop
if (lua_isnumber(l, -1)) {
int ret = lua_tointeger(l, -1); // 戻り値その 2
printf("ret=%d\n", ret);
}
lua_pop(l, 1); // 戻り値を pop
  ・・・・・
  ・・・・・

正に、この様なことをやりたい。


そこで、参考資料を集めた。


上記検索で見つけたサイト:第6章 C言語との連携

いつも参照している:Lua 5.2 リファレンスマニュアル

Lua5.1 教科書?:Programming in Lua (first edition)

他に検索で見つけた:Lua処理系コード読み(13) luaL_newstate


以上、合計5件を学習した。


ここで、
C言語でコーディングしてコンパイル
はしたくない。

GSL Shell なら、同等な事ができるはず?
それには、何かDLLが必要。


ふと思いついた、
GSL Shell インストール場所にあるlua51.dllでは?

中を見ると、luaL_newstateが有りそう?

そうすると、
Lua インストール場所にあるlua53.dllで行けそう。

と云うことで、上記call.cpp相当を作ってみた。
初めてなので、確認用にかなり print 文を入れている:
----- test_call_lua.gsl -----
lua = ffi.load( 'lua53' )
ffi.cdef[[ typedef void L_S;
typedef double lua_Number; typedef int32_t lua_Integer;
L_S* luaL_newstate( void );
int lua_gettop( L_S* L );
int lua_type( L_S* L, int index );
void luaL_openlibs( L_S* L );
// int luaL_loadfile( L_S* L, const char* filename); // これは無し***
int luaL_loadfilex( L_S* L, const char* filename, const char* mode);
// int lua_pcall( L_S* L, int nargs, int nresults, int msgh ); // これは無し***
int lua_pcallk( L_S* L, int nargs, int nresults, int errfunc, int ctx, void* k );
////////// 正しくは、・・・・・・・・・・・・・・・・・・ int ctx, lua_CFunc k );
void lua_getglobal( L_S* L, const char* name );
void lua_pushnumber( L_S* L, lua_Number n );
int lua_isnumber( L_S* L, int index );
// lua_Integer lua_tointeger( L_S* L, int index ); // これは無し***
lua_Integer lua_tointegerx( L_S* L, int index, void* isnum );
//// void lua_pop( L_S* L, int n ); // これはマクロ***
void lua_settop( L_S* L, int m ); // m == -(n) - 1
void lua_close( L_S* L );
]]
charA = |s| ffi.cast( 'char*', s )
voidA = |s| ffi.cast( 'void*', s ); NULL=voidA(0)
function printf( f, s, ... )
f = f or io.stdout
f:write(s:format(...))
end
----- 以下 print は、デバッグ用
L = lua.luaL_newstate(); print( L ); --
lua.luaL_openlibs(L)

z = lua.luaL_loadfilex(L, 'func.lua', charA(0)); -- 呼び出すProg
print(z) -- 0
S = lua.lua_gettop(L); T = lua.lua_type(L, 1); print( S, T ) -- 1 , 6

z = lua.lua_pcallk(L, 0, 0, 0, 0, NULL); -- script を一度実行しておく
print(z) -- 0

lua.lua_getglobal(L, 'fun' ); -- 呼び出す関数
S = lua.lua_gettop(L); T = lua.lua_type(L, S); print( S, T ) -- 1, 6

lua.lua_pushnumber(L, 4); -- 第一引数
S = lua.lua_gettop(L); T = lua.lua_type(L, S); print( S, T ) -- 2, 3

lua.lua_pushnumber(L, 5); -- 第ニ引数
S = lua.lua_gettop(L); T = lua.lua_type(L, S); print( S, T ) -- 3, 3

if (lua.lua_pcallk(L, 2, 2, 0, 0, NULL) ~= 0) then -- 引数 2 個, 戻り値 2 個
printf( nil, 'cannot exec add. %s\n', tostring(L)); ----- 中で、4.0 5.0 を print
os.exit(0)
end
if( lua.lua_isnumber(L, -1)) then
ret = lua.lua_tointegerx(L, -1, NULL); -- 戻り値その 1
printf( nil, "ret=%d\n", ret); -- 7 == 5 + 2
end
S = lua.lua_gettop(L); lua.lua_settop(L, S-1); -- lua_pop(L,1); 戻り値を pop
if (lua.lua_isnumber(L, -1)) then
ret = lua.lua_tointegerx(L, -1, NULL); -- 戻り値その 2
printf( nil, "ret=%d\n", ret); -- 5 == 4 + 1
end
S = lua.lua_gettop(L); lua.lua_settop(L, S-1); -- lua.pop(L,1); 戻り値を pop

lua.lua_close(L)
これで?

一応処理結果は正しそうだが、
最終的に「libgcc_s_dw2-1.dll」が無い でアボート???


正直に C言語でコーディングしてコンパイルするのでは無いので、・・・・・

マクロであったり、関数名が異なっていたり、

かなり苦労した。

でも何とか行けそうダ。


本日はここまで。


call_Lua 似非モジュールは作れそう。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170312
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク