IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[C++/LUA] Pousser un tableau sur la pile


Sujet :

C++

  1. #1
    Membre éclairé Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Points : 791
    Points
    791
    Par défaut [C++/LUA] Pousser un tableau sur la pile
    Bonjour à tous.

    Je suis en train de faire une petite plate-forme multi-agents, et je voudrais externaliser une fonction vers lua.

    Je souhaiterais appeler une fonction lua avec en paramètre un tableau de la forme suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {{"typeagent1", {x1, y1}}
     {"typeagent2", {x2, y2}}
     {"typeagent3", {x3, y3}}
    }
    Ce tableau représente les agents perçus par l'agent courant. La fonction lua doit donc pouvoir itérer sur ces agents (idéalement uniquement sur les agents d'un type donné) et renvoyer un vecteur et un angle.

    Mon problème est de créer un tel tableau et de le pousser sur la pile.

    Voici le code auquel je suis arrivé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    void Bird::live(){
    	std::vector<Perception*> perceptions = getPerceptions();
    	lua_getglobal(m_state, "live");
    	if(!lua_isfunction(m_state, -1)){
    		Log::i("BIRD") << "Lua function 'live' not found!";
    		lua_pop(m_state, 1);
    		wander();
    	}else{
    		if(perceptions.size() > 0){
    			lua_newtable(m_state);
    			for(unsigned int i = 0; i < perceptions.size(); ++i){
    				lua_newtable(m_state);
    				lua_pushstring(m_state, "bird");
    				lua_setfield(m_state, -2, "type");
     
    				lua_newtable(m_state);
    				lua_pushnumber(m_state, perceptions.at(i)->getObject()->getPosition().x);
    				lua_setfield(m_state, -2, "x");
    				lua_pushnumber(m_state, perceptions.at(i)->getObject()->getPosition().y);
    				lua_setfield(m_state, -2, "y");
    				lua_setfield(m_state, -2, "coord");
    				lua_setfield(m_state, -2, "target");
    			}
    		}else{
    			lua_pushnil(m_state);
    		}
    		lua_call(m_state, 1, 0);
    	}
    	wander();
    }
    Malheureusement, je crois comprendre que la boucle ne fait que réécrire sur la première ligne, et je ne peux pas itérer comme je le voudrais en LUA.

    NB: je suis débutant en LUA et en binding C/LUA, il y a peut-être une meilleure façon de faire cela, je suis preneur...

    Merci d'avance, Seeme

  2. #2
    Membre éclairé Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Points : 791
    Points
    791
    Par défaut
    Bien, donc j'ai trouvé la réponse tout seul comme un grand, je la met là si ça peut aider quelqu'un.

    Ce code ressort un tableau de la forme
    { 1 { type = "bird", coord = { x = 1, y = 2 } }
    2 { type = "bird", coord = { x = 2, y = 3 } }
    ...
    }

    (bon, il fait un peu plus que ça mais bon...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    void Bird::live(){
    	std::vector<Perception*> perceptions = getPerceptions();
    	lua_getglobal(m_state, "live");
    	if(!lua_isfunction(m_state, -1)){
    		Log::i("BIRD") << "Lua function 'live' not found!";
    		lua_pop(m_state, 1);
    		wander();
    	}else{
    		if(perceptions.size() > 0){
    			lua_newtable(m_state);
    			for(unsigned int i = 0; i < perceptions.size(); ++i){
    				lua_pushnumber(m_state, i+1);
    				lua_newtable(m_state);
    				lua_pushstring(m_state, "type");
    				lua_pushstring(m_state, "bird");
    				lua_rawset(m_state, -3);
     
    				lua_pushstring(m_state, "coord");
    				lua_newtable(m_state);
    				lua_pushstring(m_state, "x");
    				lua_pushnumber(m_state, perceptions.at(i)->getObject()->getPosition().x);
    				lua_rawset(m_state, -3);
     
    				lua_pushstring(m_state, "y");
    				lua_pushnumber(m_state, perceptions.at(i)->getObject()->getPosition().y);
    				lua_rawset(m_state, -3);
     
    				lua_rawset(m_state, -3);
     
    				lua_rawset(m_state, -3);
    			}
    		}else{
    			lua_pushnil(m_state);
    		}
    		lua_call(m_state, 1, 3);
    		if(!lua_isnumber(m_state, -1) || !lua_isnumber(m_state, -2) || !lua_isnumber(m_state, -3)){
    			Log::e("BIRD") << "Live fonction is not returning numbers";
    		}
     
    		float x = 0, y = 0, theta = 0;
    		theta = lua_tonumber(m_state, -1);
    		y = lua_tonumber(m_state, -2);
    		x = lua_tonumber(m_state, -3);
     
    		lua_pop(m_state, 3);
     
    		m_body->setInfluence(Vect3<float>(x, y, 0), theta);
    	}
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. envoyer un tableau sur le serveur
    Par car dans le forum ASP
    Réponses: 5
    Dernier message: 16/08/2005, 16h23
  2. Réponses: 4
    Dernier message: 28/07/2005, 16h22
  3. [CR]Ne pas "couper" un tableau sur 2 pages
    Par neo.51 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 01/03/2005, 14h12
  4. [CR8] Problème tableau sur plusieurs pages???
    Par christophe28 dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 02/11/2004, 15h46
  5. Créer des objets sur la pile ?
    Par Cornell dans le forum Langage
    Réponses: 8
    Dernier message: 03/03/2003, 11h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo