2012-05-12 2 views
0

Je veux configurer quelques fonctions dans Lua pour les scripteurs, mais quand ces fonctions sont invoquées, j'aimerais qu'elles invoquent réellement une seule fonction avec un paramètre que je définis. Cela pourrait ressembler à:Lua callbacks avec meta data

Lua:

foo1() 
    foo2() 

C++:

int myFunction(lua_State * context) 
{ 
    int numArgs = lua_gettop(context); 
    int topOfStack = -3; 
    bool lightUserDataFlag = lua_islightuserdata(context, topOfStack); 

    if(lightUserDataFlag) 
    { 
    } 
} 

}

Je suis un peu confus sur la configuration. J'essaye d'enregistrer le rappel avec un param. C'est ce que j'ai jusqu'ici et il y a quelque chose qui ne sauve pas le param avec l'enregistrement de fonction; il semble ne sauver que le dernier paramètre que j'ajoute.

void setupCallback() 
{ 
    lua_register(context, "foo1", Callback); 
    lua_pushlightuserdata(context, &value[0]); 
    lua_register(context, "foo2", Callback); 
    lua_pushlightuserdata(context, &value[1]); 
} 

Lorsque lua invoque mon rappel, je vois toujours la valeur [1], jamais la valeur [0]. J'ai joué avec l'idée d'enregistrer le rappel et ensuite d'ajouter une table, mais je ne suis pas sûr que cela m'amène à aller plus loin. Pour le pourquoi: J'essaie d'abstraire les noms de fonctions pour faciliter l'écriture de code pour nos programmeurs lua, mais ceux-ci ont simplement besoin de traduire dans la même fonction paramétrée. Pensez-y ajouter des paramètres changeants en passant un seul paramètre, mais nommant cela différemment.

Pensées?

Répondre

4

Vous souhaitez probablement associer ces valeurs de contexte en tant que valeurs supérieures de votre fonction. Jetez un oeil à lua_pushcclosure().

Incorporer le commentaire de Mickey Kawick:

int Callback (lua_State *context) 
{ 
    int val= lua_tointeger(context, lua_upvalueindex(1)); 
    cout << val << endl; 
    ... 
} 

void setup() 
{ 
    lua_pushnumber(context, 3); 
    lua_pushcclosure(context, Callback, 1); 
    lua_setglobal(context, "foo1"); 

    lua_pushnumber(context, 42); 
    lua_pushcclosure(context, Callback, 1); 
    lua_setglobal(context, "foo2"); 
} 
+0

C'est exactement ce que je avais besoin. Je me suis retrouvé avec ça. int \t Rappel (contexte lua_State *) { int val = lua_tointeger (contexte, lua_upvalueindex (1)); cout << val << endl; ... void setup() { lua_pushnumber (contexte, 3); lua_pushcclosure (contexte, rappel, 1); lua_setglobal (context, "foo1"); lua_pushnumber (contexte, 42); lua_pushcclosure (contexte, rappel, 1); lua_setglobal (context, "foo2"); –

+0

@MickeyKawick: Vous devez accepter les réponses qui répondent à vos besoins en cochant la case correspondante. – Managu