2011-01-25 8 views
1

積分値はLuaの文字列に還元されますか?tostring/checkstringでアクセスすると整数が文字列になりますか?

のmain.c:

#include <stdio.h> 
#include "lua.h" 
#include "lauxlib.h" 
#include "lualib.h" 

int ex_dummyfunc(lua_State* L) 
{ 
    const char* first = luaL_checkstring(L, 1); 
    int second = luaL_checkinteger(L, 2); 
    printf("first = %s, second = %d\n", first, second); 
    return 0; 
} 

int main(int argc, char *argv[]) 
{ 
    lua_State *L = luaL_newstate(); 
    luaL_openlibs(L); 
    lua_register(L, "dummyfunc", ex_dummyfunc); 
    if(argc > 1) 
    { 
     if(luaL_dofile(L, argv[1]) == 1) 
     { 
      fprintf(stderr, "error: %s\n", lua_tostring(L, 1)); 
     } 
    } 
    lua_close(L); 
    return 0; 
} 

test.lua私は数字が文字列と同じであることに気づいたとき、私は、次のコードを与え、ほぼ満杯で、時間のバグを追跡しようとしました:

dummyfunc("stuff", 42) 
dummyfunc(42, 8) 
dummyfunc(82, "stuff") 

出力:

first = stuff, second = 42 
first = 42, second = 8 
error: test.lua:4: bad argument #2 to 'dummyfunc' (number expected, got string) 

_ EDIT _

answer by Kevin Ballardのおかげで、および型チェックが内部で実行される方法についていくつかのグーグルが、私はトークンベースタイプの適用を可能にluaL_checktypeを、気づきました。だから、文字列引数を強制するために、この方法で編集する必要がありますex_dummyfunc機能:

int ex_dummyfunc(lua_State* L) 
{ 
    luaL_checktype(L, 1, LUA_TSTRING); 
    const char* first = luaL_checkstring(L, 1); 
    int second = luaL_checkinteger(L, 2); 
    printf("first = %s, second = %d\n", first, second); 
    return 0; 
} 

はなぜLuaはdummyfuncに2回目の呼び出しのタイプのエラーをスローしませんか?ドキュメントによれば

+0

プログラムを実行するときの実際の出力は何ですか? –

+0

@Peter Lillevold:質問 –

答えて

3

CONSTチャー*のluaL_checkstring (lua_State * 1、INT第narg)。

ファンクション引数nargが文字列 であるかどうかをチェックし、この文字列を戻します。

この関数はlua_tolstring〜 を使用して結果を得ます。そのため、すべてのコンバージョンと の警告がここに適用されます。

lua_tolstringのドキュメントでは、「Luaの値は文字列または数字でなければならない」と記載されています。だから、Luaは文字列と数値を内部的には格納しませんが、必要に応じて2つの間で変換する傾向があります。

+0

ナッツを編集しましたが、どうにかして 'lua_checktype'で強制することができると思います –

関連する問題