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 chevronn� Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    D�tails du profil
    Informations personnelles :
    �ge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    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 chevronn� Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    D�tails du profil
    Informations personnelles :
    �ge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    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