スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--.--.-- | スポンサー広告

[Lua] LuaとC/C++をつなぐ(その1)

ちょっとLuaのC/C++バインディングについて調べてみました。

が、ちょっと最初のほうからご紹介してみます。
Luaは組み込み向けということで、当然Cとの間を連携するAPIがあります。
おおよそこんな感じのAPIです。


準備としてこんな感じでヘッダをインクルードして、さらにLua本体のライブラリをリンクして(ソース全部プロジェクトにぶちこんでも結構ですが)・・・。


extern "C" {
#include "lua.h"
#include "lauxlib.h"
}


以下簡単なサンプルです。

// 実行するLuaスクリプト文字列(3つの値を返すだけ)
string strLuaScript =
"return '1番目の返り値', '2番目の返り値', '3番目の返り値'";//←ここがLua

lua_State *L = lua_open(); // Luaバーチャルマシンを作成
lua_dostring(L, strLuaScript.c_str()); // 文字列をLUAスクリプトとして実行
string result1 = lua_tostring(L, 1); // 返り値1を取得
string result2 = lua_tostring(L, 2); // 返り値2を取得
string result3 = lua_tostring(L, 3); // 返り値3を取得
cout << result1 << "|" << result2 << "|" << result3 << endl;

<実行結果>
1番目の返り値|2番目の返り値|3番目の返り値


ここで、「返り値nを取得」というところでは、実は「スタック」(いわゆるCのスタックではなくて、Lua特有のもの)を参照しています。
つまり、スタックに3つの結果が積まれている状態です。
このように、LuaとCとの間はこの「スタック」でデータをやりとりすることになります。この「スタック」に値が存在するうちは、その値はLuaの中に値があるわけで、ガベコレされてしまうことはありません。

また、独自のC関数をLuaに持ち込みたい場合は、

// テキストをリピートするC関数
int textrepeat(lua_State *L) {
string text = lua_tostring(L, 1); // 1番目の引数を取得
int count = (int) lua_tonumber(L, 2); // 2番目の引数を取得
string result = "";
for ( int i=0 ; i lua_pushstring(L, result.c_str());
return 1;
}

のように関数が定義されているとして、以下のようにすれば関数が登録され、Luaサイドから実行されます。


string strLuaScript =
"return textrepeat('Lua', 10)"; // 実行するLuaスクリプト文字列

lua_State *L = lua_open(); // Luaバーチャルマシンを作成
lua_register(L, "textrepeat", textrepeat); // C関数をLuaから呼べるように登録
lua_dostring(L, strLuaScript.c_str()); // 文字列をLUAスクリプトとして実行
string result1 = lua_tostring(L, 1); // 返り値1を取得
cout << result1 << endl;

<実行結果>
LuaLuaLuaLuaLuaLuaLuaLuaLuaLua


この「スタック」を使用したAPIは、わかりにくすぎるというほどではないのですが、しかしスタックの「位置」を直接指定しなければならないこのインタフェースはあまり使いやすいとはいえません。複雑なテーブル構造を渡したい場合、読み込みたい場合などは特に大変です。やればできるとはいえますが、多少の修正はささっと処理したいスクリプトまわりですし、もっと直感的な方法があればそれに越したことはありません。

そこで・・・というわけですが、長くなったので記事分けますね。
>>その2へ
スポンサーサイト

2005.09.03 | Comments(0) | Trackback(0) | Lua

新しい記事へ <<  | HOME |  >> 古い記事へ

広告:

FC2Ad

カテゴリ展開メニュー

  • 未分類(13)
  • Lua(38)
  • プログラミング(11)
  • 食べ物(3)
  • SPAM(2)
  • ゲーム開発(4)
  • GIS/GPS/GoogleMaps(2)
  • スポーツ(1)
  • Skype API(1)
  • AR(1)

はてブ ランキング

ブログ全体: このWikiのはてなブックマーク数

プロフィール

はむ!

Author:はむ!
よく使う言語・環境:
C++,C,Lua,java,VBA,DB
たまにPHPとかjavascript
血液型:O型

メール: lua%ham.nifty.jp
(%を@に変えてください)
ついったー: @hammmm

Lua関連アンテナ

ブロとも申請フォーム

この人とブロともになる

全記事表示リンク

全ての記事を表示する

ブログ内検索


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。