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 :

luabind : retour d'une fonction C++


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Dev
    Inscrit en
    Mai 2009
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Mai 2009
    Messages : 257
    Points : 190
    Points
    190
    Par défaut luabind : retour d'une fonction C++
    Bonjour

    m'étant mis aux langage de script lua récemment, j'essaye de mettre en place un binding lua/C++ avec luabind

    j'ai un souci sur le façon de récupérer la valeur de retour d'une fonction C++ appelée depuis lua

    par exemple si je veux entrer le carré d'un nombre et récupérer le résultat dans une string:

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
     
    #include "lua.hpp"
    #include "luabind.hpp"
     
    #include <string>
    #include <cstring>
    #include <iostream>
    #include <sstream>
     
    using namespace std;
     
    string intToString(int n)
    {
         ostringstream out;
         out<<n;
         string s = out.str();
     
         return s;
    }
     
    char* stringToChar(string str)
    {
        size_t size  = str.size()+1;
        char* ch = new char[size];
        strncpy( ch, str.c_str(), size );
     
        return ch;
    }
     
    const char* square(int number) {
     
    	int res = number * number;
     
            string sres = "résultat : " + intToString(number)
     
    	return sres.c_str();
    }
     
    int main(){
     
    	  lua_State *myLuaState = lua_open();
     
    	  luabind::open(myLuaState);
     
    	  luabind::module(myLuaState) [
    	    luabind::def("square", square)
    	  ];
     
     
              int number  = 5;
     
    	  string str = "square(" + intToString(number) + ")";
    	  char* param = stringToChar(str);
     
    	  luaL_dostring(
    	    myLuaState,
    	    param
    	  );
     
              //retour de la fonction C++ "square" en string
              string stres("");
     
    	  const char * res = lua_tostring(myLuaState, -1);
    	  stres.assign( res );
     
    	  delete [] param;
              delete res;
     
    	  lua_close(myLuaState);
     
    	 cout<<"resultat final : " << stres << endl;
    }
    le problème c'est que dans la chaine "resultat final", je n'obtiens rien

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Dans square quand tu fais :
    Tu renvoies un pointeur sur une donnée locale, sres est local à la fonction.

    Par contre tu n'as pas besoin de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* param = stringToChar(str);
    Tu peux passer directement str.c_str() à luaL_dostring.

    Ensuite quand tu récupères le résultat tu peux vraisemblablement faire directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string stres = lua_tostring(myLuaState, -1);
    En tous cas :
    S'écrit simplement :
    MAT.

  3. #3
    Membre habitué
    Profil pro
    Dev
    Inscrit en
    Mai 2009
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Mai 2009
    Messages : 257
    Points : 190
    Points
    190
    Par défaut
    j'ai corrigé les petites erreurs mais la première persiste : en effet j'ai tenté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::string stres = lua_tostring(myLuaState, -1);
    qui lève une exception (sans que je puisse la catcher d'ailleurs)

    lua_tostring renvoie donc bien uniquement un const char* (du moins sous lua_bind)

    d'ou le probleme du pointeur local retourné effectivement

    par ailleurs, même si square renvoie une std::string,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout<< lua_tostring(myLuaState, -1)
    ne m'affiche rien

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Citation Envoyé par coda_blank Voir le message
    j'ai tenté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string stres = lua_tostring(myLuaState, -1);
    En fait tant qu'à faire c'est même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string stres( lua_tostring(myLuaState, -1) );
    Citation Envoyé par coda_blank Voir le message
    qui lève une exception (sans que je puisse la catcher d'ailleurs)
    C'est pas surtout que ça plante ?

    Citation Envoyé par coda_blank Voir le message
    lua_tostring renvoie donc bien uniquement un const char*
    Oui, qui est assignable ou peut-être utilisé pour construire un std::string, ou même envoyé directement dans un std::ostream (j'ai des dizaines de lignes de code sous les yeux là qui font justement ça dans une bibliothèque faite par un collègue)

    Citation Envoyé par coda_blank Voir le message
    d'ou le probleme du pointeur local retourné effectivement
    Pourquoi tu ne retournes pas un type numérique ? Genre un int par exemple.

    MAT.

  5. #5
    Membre habitué
    Profil pro
    Dev
    Inscrit en
    Mai 2009
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Mai 2009
    Messages : 257
    Points : 190
    Points
    190
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    En fait tant qu'à faire c'est même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string stres( lua_tostring(myLuaState, -1) );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    terminate called after throwing an instance of 'std::logic_error'
      what():  basic_string::_S_construct NULL not valid
    Oui, qui est assignable ou peut-être utilisé pour construire un std::string, ou même envoyé directement dans un std::ostream (j'ai des dizaines de lignes de code sous les yeux là qui font justement ça dans une bibliothèque faite par un collègue)

    Pourquoi tu ne retournes pas un type numérique ? Genre un int par exemple.

    J'ai deja testé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout<< lua_tostring(myLuaState, -1)

    et ça ne m'affiche strictement rien, quelque soit le type retourné par square, string ou int



    MAT.

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Actuellement, si tu n'as pas modifié square, ça fait de toute façon n'importe quoi parce que tu retournes un pointeur sur une variable locale à la fonction...

    Pour récupérer un nombre il faut utiliser lua_tonumber.

    En fait, ça là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    terminate called after throwing an instance of 'std::logic_error'
    what():  basic_string::_S_construct NULL not valid
    Ca signifie que le char* que tu récupères vaut 0 (est NULL quoi).
    Je pense que ça veut dire que ce n'est pas une chaîne de caractères qui est en haut de la pile LUA.

    MAT.

  7. #7
    Membre habitué
    Profil pro
    Dev
    Inscrit en
    Mai 2009
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Mai 2009
    Messages : 257
    Points : 190
    Points
    190
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Actuellement, si tu n'as pas modifié square, ça fait de toute façon n'importe quoi parce que tu retournes un pointeur sur une variable locale à la fonction...


    j'ai évidemment modifié le corps de square en conséquence...
    donc j'ai renvoyé une string ou un int


    Pour récupérer un nombre il faut utiliser lua_tonumber.

    je viens de tester également, ça me retourne 0 alors que j'ai renvoyé 9999

    En fait, ça là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    terminate called after throwing an instance of 'std::logic_error'
    what():  basic_string::_S_construct NULL not valid
    Ca signifie que le char* que tu récupères vaut 0 (est NULL quoi).
    Je pense que ça veut dire que ce n'est pas une chaîne de caractères qui est en haut de la pile LUA.

    qu'est ce donc si ce n'est une std::string ?

    MAT.
    il y a manifestement un problème avec le luastate

    sinon vous obtenez quoi chez vous avec ce que j'ai posté ?

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Citation Envoyé par coda_blank Voir le message
    sinon vous obtenez quoi chez vous avec ce que j'ai posté ?
    Refais voir le code actuel ?

    MAT.

  9. #9
    Membre habitué
    Profil pro
    Dev
    Inscrit en
    Mai 2009
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Mai 2009
    Messages : 257
    Points : 190
    Points
    190
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Refais voir le code actuel ?

    MAT.
    dsl pour la réponse tardive

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    #include "lua.hpp"
    #include "luabind.hpp"
     
    #include <string>
    #include <cstring>
    #include <iostream>
    #include <sstream>
     
    using namespace std;
     
    string intToString(int n)
    {
         ostringstream out;
         out<<n;
         string s = out.str();
     
         return s;
    }
     
    string squareString(int number) {
     
    	int res = number * number;
     
            string sres = "résultat : " + intToString(res)
     
    	return sres;
    }
     
    //int squareInt(int number) {
    	//int res = number * number;
    	//return res;
    }
    
    int main(){
     
    	  lua_State *myLuaState = lua_open();
     
    	  luabind::open(myLuaState);
     
    	  luabind::module(myLuaState) [
    	    luabind::def("squareString", squareString)
                //luabind::def("squareInt", squareInt)
    	  ];
     
     
              int number  = 5;
     
    	  string str = "squareString(" + intToString(number) + ")";
             //string strI = "squareInt(" //+intToString(number) + ")";
    
    	  luaL_dostring(
    	    myLuaState,
    	    str.c_str()
    	  );
    
              //luaL_dostring(
    	    //myLuaState,
    	    //strI.c_str()
    	  //);
     
              //retour de la fonction C++ "square" en string
              string stres("");
    
             //retour de la fonction C++ "square" en int
              //int ires = 0;
     
    	  const char * res = lua_tostring(myLuaState, -1);
    	  stres.assign( res );
      
              //ires = lua_tonumber(myLuaState,-1);
    
    	  lua_close(myLuaState);
     
    	 cout<<"resultat final : " << stres << endl;
             //cout<<"resultat final : " << ires <<endl;
    
    }
    j'ai mis les deux versions

  10. #10
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Ca ne compile pas...

    Et puis tu enregistres "square" alors qu'ensuite tu appelles "squareString"
    Et puis tu calcules le carré mais tu retournes "number"...

    MAT.

  11. #11
    Membre habitué
    Profil pro
    Dev
    Inscrit en
    Mai 2009
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Mai 2009
    Messages : 257
    Points : 190
    Points
    190
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Ca ne compile pas...

    Et puis tu enregistres "square" alors qu'ensuite tu appelles "squareString"
    Et puis tu calcules le carré mais tu retournes "number"...

    MAT.
    ok j'ai corrigé

    vous avez les libs lua et luabind ?

  12. #12
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Citation Envoyé par coda_blank Voir le message
    vous avez les libs lua et luabind ?
    Oui, sauf qu'il semble que ma version de luabind est peut-être un peu obsolète par rapport à ma version de lua et ça plante sur l'appel à luabind::def.
    Désolé...

    MAT.

Discussions similaires

  1. retour d'une fonction
    Par papy_tergnier dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 15/05/2006, 18h21
  2. [XML][XSLT][debutant]retour d'une fonction
    Par maxvador dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 30/03/2006, 15h12
  3. recuperer en php le retour d'une fonction plsql
    Par gismoblue dans le forum Langage SQL
    Réponses: 1
    Dernier message: 14/03/2006, 17h39
  4. PL/SQL retour d'une fonction
    Par aaronw dans le forum PL/SQL
    Réponses: 2
    Dernier message: 13/12/2005, 14h25
  5. [Oracle 9.1] Types de retour d'une fonction PL/SQL
    Par ftrifiro dans le forum PL/SQL
    Réponses: 8
    Dernier message: 12/10/2005, 17h54

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