2010-09-22 5 views
2

J'ai le code C++ en utilisant swig qui crée une structure, le passe à lua (essentiellement par référence), et permet la manipulation de la structure de telle sorte que les modifications apportées dans le code lua rester une fois que je suis retourné à la fonction C++. Tout cela fonctionne bien jusqu'à ce que j'ajouter une std :: string à la struct, comme indiqué ici:Struct contenant std :: string étant passé à lua

struct stuff 
{ 
    int x; 
    int y; 
    std::string z; 
}; 

Je ne peux pas modifier le std :: string, car il est apparemment passé comme une référence const. Si je tente d'attribuer une valeur à cette chaîne dans ma fonction Lua je reçois cette erreur:

Error in str (arg 2), expected 'std::string const &' got 'string'

Quelle est la bonne façon de résoudre ce problème? Dois-je écrire une fonction C++ personnalisée pour définir z plutôt que d'utiliser une syntaxe normale comme obj.z = "hi"? Y at-il un moyen de permettre cette affectation en utilisant swig?

Le code C++ est


#include <stdio.h> 
#include <string.h> 
extern "C" { 
#include "lua.h" 
#include "lualib.h" 
#include "lauxlib.h" 
} 

#include "example_wrap.hxx" 

extern int luaopen_example(lua_State* L); // declare the wrapped module 

int main() 
{ 

    char buff[256]; 
    const char *cmdstr = "print(33)\n"; 
    int error; 
    lua_State *L = lua_open(); 
    luaL_openlibs(L); 
    luaopen_example(L); 

    struct stuff b; 

    b.x = 1; 
    b.y = 2; 

    SWIG_NewPointerObj(L, &b, SWIGTYPE_p_stuff, 0); 
    lua_setglobal(L, "b"); 

    while (fgets(buff, sizeof(buff), stdin) != NULL) { 
     error = luaL_loadbuffer(L, buff, strlen(buff), "line") || 
       lua_pcall(L, 0, 0, 0); 
     if (error) { 
      fprintf(stderr, "%s", lua_tostring(L, -1)); 
      lua_pop(L, 1); /* pop error message from the stack */ 
     } 
     } 

     printf("B.y now %d\n", b.y); 
     printf("Str now %s\n", b.str.c_str()); 
     luaL_dostring(L, cmdstr); 
     lua_close(L); 
     return 0; 

}

Répondre

4

Vous devez ajouter %include <std_string.i> à votre module SWIG. Sinon, il ne sait pas comment mapper un Lua string en C++ std::string.


A common problem that people encounter is that of classes/structures containing a std::string. This can be overcome by defining a typemap. For example:

%module example 
%include "std_string.i" 

%apply const std::string& {std::string* foo}; 

struct my_struct 
{ 
    std::string foo; 
}; 
+0

J'ai dans mon fichier .i; le problème semble être que swig rend les références constantes de la chaîne, donc vous ne pouvez pas les changer. – alanc10n

+0

Fantastique, le typemap a résolu mon problème. Merci beaucoup pour l'aide! – alanc10n

Questions connexes