2011-11-14 27 views
3

Luaの数字を含むリストをCに渡し、Cでアクセスしたいのですが、どうすればいいですか?LuaからCにテーブル(数値のリスト)を渡してアクセスする方法

私は、次の表があるとします。

x = {1, 2, 3, 9, 5, 6} 

私は私が使用してそれを送っCに送信し、C.

に配列にこのテーブルを格納したい:

quicksort(x) 

quicksortは、Cで定義した関数です。

012にアクセスするにはどうすればよいですかCの?

答えて

9

関数に渡すテーブルは、関数のスタック上にあります。 lua_getfieldまたはlua_gettableを使用してインデックスを作成できます。

lua_nextを使用してテーブルをトラバースする場合は、必要に応じてCで配列を設定できます。配列の場合は、1から#tまでの繰り返しで十分です。

いくつかの例ユーティリティコード(未テスト):

int* checkarray_double(lua_State *L, int narg, int *len_out) { 
    luaL_checktype(L, narg, LUA_TTABLE); 

    int len = lua_objlen(L, narg); 
    *len_out = len; 
    double *buff = (double*)malloc(len*sizeof(double)); 

    for(int i = 0; i < len; i++) { 
     lua_pushinteger(L, i+1); 
     lua_gettable(L, -2); 
     if(lua_isnumber(L, -1)) { 
      buff[i] = lua_tonumber(L, -1); 
     } else { 
      lua_pushfstring(L, 
       strcat(
        strcat(
         "invalid entry #%d in array argument #%d (expected number, got ", 
         luaL_typename(L, -1) 
        ), 
        ")" 
       ), 
       i, narg 
      ); 
      lua_error(L); 
     } 
     lua_pop(L, 1); 
    } 

    return buff; 
} 
+0

私はCに触れ、またLuaのCのAPI、looonngg時間のためにしていません。もし私がコードを間違えてしまったら、誰か修正してもらえますか? – Deco

+0

Decoとjpjacobsをお手伝いしてくれてありがとうございますが、私は疑いがあります...仮想スタックをCプログラムに渡すとき、どうすればそれを受け取ることができますか? lua_gettableを使用したい場合、インデックス値は何ですか?私はインデックス値のために何を使うべきか確信しています。私はluaプログラムのテーブルxをCに渡しました。lua_gettopで取得できる長さはわかりませんが、lua_gettableでどのインデックスを使用すればいいですか。このテーブルをどのタイプの変数に格納するべきですか?私はそれに疑問を持っている。申し訳ありませんが、私はルアの新しいですので、私と一緒にご負担ください。もう一度お返事いただきありがとうございます..... :) – Rahul

+0

"Lua"のスタックプッシュ操作とポップ操作が説明されている良いサイトのリンクを私に提供できますか?私はここでlua_pop(L、1)を行った理由を知ることができません。私はそれを試して、これで動作したが、私はスタックから要素をポップすると思う、私たちはトップを飛び出す必要があるので、ここではlua_pop(L、-1)だったはずです。しかし、なぜそれが "1"であるのですか?私のコードが動作し始め、スタックインデックスの概念を一番上に置き、lua_gettableを使用していますが、私たちがなぜpopを1として使用しているのか理解できませんでした。それはすべての人に役立つだろう。 – Rahul

関連する問題