call_Lua 似非モジュール:Lua51.dll 利用版

2017-04-15 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-04-14)の記事「call_Lua 似非モジュール」では、
Lua インストール場所にあるLua53.dllを使た。
しかし、
  ・・・・・
  ・・・・・
  一応処理結果は正しそうだが、
  最終的に「libgcc_s_dw2-1.dll」が無い でアボート???
  ・・・・・
  ・・・・・
で、
精神衛生上ヨロシク無い。


それでは、
と、
GSL Shell インストール場所にあるlua51.dllを使ったらどうか?


今回更なる参考資料として、
サイト:「Lua 5.1 リファレンスマニュアル
へのショートカットと、
ヘッダファイル「lua51.h」を参照。
これは、定数の定義値を参照するため。


単純に、
前回の最初の文:
  lua = ffi.load( 'lua53' )

  lua = ffi.load( 'lua51' )
に変えたダケではエラー!?!?!?

いろいろ変更して、
出来上がったコードは:
----- test_call_Lua51.gsl -----
lua = ffi.load( 'lua51' )
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 );
// void lua_getglobal( L_S* L, const char* name ); // これは無し***
// void lua_getfield( L_S* L, LUA_GLOBALSINDEX, const char* name );
void lua_getfield( L_S* L, int i , 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_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_pcall(L, 0, 0, 0 ); -- script を実行しておかないと関数を呼び出せない
print(z) -- 0

-- lua.lua_getglobal(L, 'fun' ); -- 呼び出す関数
lua.lua_getfield( L, -10002, '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_pcall(L, 2, 2, 0) ~= 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_tointeger(L, -1); -- 戻り値その 1
printf( nil, "ret=%d\n", ret); -- 7 == 5 + 2
end
S = lua.lua_gettop(L); lua.lua_settop(L, S-1); -- lua.lua_pop(L,1); 戻り値を pop
if (lua.lua_isnumber(L, -1)) then
ret = lua.lua_tointeger(L, -1); -- 戻り値その 2
printf( nil, "ret=%d\n", ret); -- 5 == 4 + 1
end
S = lua.lua_gettop(L); lua.lua_settop(L, S-1); -- lua.lua.pop(L,1); 戻り値を pop

lua.lua_close(L)
こうなった。


処理結果は、
アボートも起こらず終了。
正しそうだが?


これでも、
関数名が異なっていたり、無かったり、

かなり苦労した。

でも何とか完成した?


本日はここまで。


call_Lua 似非モジュール 学習は続く。


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


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

コメントの投稿

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

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



おきてがみ

最新記事
カレンダー
06 | 2017/07 | 08
- - - - - - 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
ブックマーク