[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

swig, c++, use string

killy-kun

3/20/2006 1:39:00 PM

I would like to use the c++ string type as a parameter of function
return of some c++ functions used in a ruby module, made with swig.

Here is a simple example I tried to use the string type :

#-----------------
%module str

%inline %{

// pour tester les string

#include <string>

using namespace std;

string fctBidon (string s)
{
string res;
res = s + " salt bidon";
return res;
}

string bidon()
{
string res = "bouh";
return res;
}

%}
#-----------------

But when I use it, here are the errors I get :

#-----------------
[eurubyt:24] bidon
==> #<SWIG::TYPE_p_string:0xb7f080e0>
[eurubyt:25] bidon.class
==> SWIG::TYPE_p_string
[eurubyt:26] fctBidon("bb")
TypeError: in method 'fctBidon', argument 1 of type 'string'
from (irb):26:in `fctBidon'
from (irb):26
#-----------------

That means the c++ string type isn't considered as the ruby String class...

Anybody knows how I can make this work ? I would like the c++ string
type to be considered as the ruby String class...
6 Answers

Mark Volkmann

3/20/2006 2:20:00 PM

0

On 3/20/06, killy-kun <killy-kun@wanadoo.fr> wrote:
> I would like to use the c++ string type as a parameter of function
> return of some c++ functions used in a ruby module, made with swig.
>
> Here is a simple example I tried to use the string type :
>
> #-----------------
> %module str
>
> %inline %{
>
> // pour tester les string
>
> #include <string>
>
> using namespace std;
>
> string fctBidon (string s)
> {
> string res;
> res = s + " salt bidon";
> return res;
> }
>
> string bidon()
> {
> string res = "bouh";
> return res;
> }
>
> %}
> #-----------------
>
> But when I use it, here are the errors I get :
>
> #-----------------
> [eurubyt:24] bidon
> ==> #<SWIG::TYPE_p_string:0xb7f080e0>
> [eurubyt:25] bidon.class
> ==> SWIG::TYPE_p_string
> [eurubyt:26] fctBidon("bb")
> TypeError: in method 'fctBidon', argument 1 of type 'string'
> from (irb):26:in `fctBidon'
> from (irb):26
> #-----------------
>
> That means the c++ string type isn't considered as the ruby String class..
>
> Anybody knows how I can make this work ? I would like the c++ string
> type to be considered as the ruby String class...

There's an example that does this near the end of a presentation I
gave. You can get a PDF of the presentation at
http://groups.yahoo.com/group/stlr.... Look for the file
RubyTools.pdf.

--
R. Mark Volkmann
Object Computing, Inc.


killy-kun

3/20/2006 6:30:00 PM

0

Mark Volkmann wrote:
> On 3/20/06, killy-kun <killy-kun@wanadoo.fr> wrote:
>
>>I would like to use the c++ string type as a parameter of function
>>return of some c++ functions used in a ruby module, made with swig.
>>
>>Here is a simple example I tried to use the string type :
>>
>>#-----------------
>>%module str
>>
>>%inline %{
>>
>>// pour tester les string
>>
>>#include <string>
>>
>>using namespace std;
>>
>>string fctBidon (string s)
>>{
>> string res;
>> res = s + " salt bidon";
>> return res;
>>}
>>
>>string bidon()
>>{
>> string res = "bouh";
>> return res;
>>}
>>
>>%}
>>#-----------------
>>
>>But when I use it, here are the errors I get :
>>
>>#-----------------
>>[eurubyt:24] bidon
>> ==> #<SWIG::TYPE_p_string:0xb7f080e0>
>>[eurubyt:25] bidon.class
>> ==> SWIG::TYPE_p_string
>>[eurubyt:26] fctBidon("bb")
>>TypeError: in method 'fctBidon', argument 1 of type 'string'
>> from (irb):26:in `fctBidon'
>> from (irb):26
>>#-----------------
>>
>>That means the c++ string type isn't considered as the ruby String class...
>>
>>Anybody knows how I can make this work ? I would like the c++ string
>>type to be considered as the ruby String class...
>
>
> There's an example that does this near the end of a presentation I
> gave. You can get a PDF of the presentation at
> http://groups.yahoo.com/group/stlr.... Look for the file
> RubyTools.pdf.
>
> --
> R. Mark Volkmann
> Object Computing, Inc.
>
>

Thank you very much.
But the problem doesn't seem tobe resolved :/
The only thing I had to add seems to be :
%include "std_string.i"

I did so, the compilation goes well, and seems to take the file into
account.
But the effect is still exactely the same...

I tried your example, but had the following error when running the
main.rb file :

ruby: symbol lookup error: ./RubyPerson.so: undefined symbol:
_ZN6PersonC1ERKSs

Mark Volkmann

3/20/2006 7:23:00 PM

0

On 3/20/06, killy-kun <killy-kun@wanadoo.fr> wrote:
> Mark Volkmann wrote:
> > On 3/20/06, killy-kun <killy-kun@wanadoo.fr> wrote:
> >
> >>I would like to use the c++ string type as a parameter of function
> >>return of some c++ functions used in a ruby module, made with swig.
> >>
> >>Here is a simple example I tried to use the string type :
> >>
> >>#-----------------
> >>%module str
> >>
> >>%inline %{
> >>
> >>// pour tester les string
> >>
> >>#include <string>
> >>
> >>using namespace std;
> >>
> >>string fctBidon (string s)
> >>{
> >> string res;
> >> res = s + " salt bidon";
> >> return res;
> >>}
> >>
> >>string bidon()
> >>{
> >> string res = "bouh";
> >> return res;
> >>}
> >>
> >>%}
> >>#-----------------
> >>
> >>But when I use it, here are the errors I get :
> >>
> >>#-----------------
> >>[eurubyt:24] bidon
> >> ==> #<SWIG::TYPE_p_string:0xb7f080e0>
> >>[eurubyt:25] bidon.class
> >> ==> SWIG::TYPE_p_string
> >>[eurubyt:26] fctBidon("bb")
> >>TypeError: in method 'fctBidon', argument 1 of type 'string'
> >> from (irb):26:in `fctBidon'
> >> from (irb):26
> >>#-----------------
> >>
> >>That means the c++ string type isn't considered as the ruby String class...
> >>
> >>Anybody knows how I can make this work ? I would like the c++ string
> >>type to be considered as the ruby String class...
> >
> >
> > There's an example that does this near the end of a presentation I
> > gave. You can get a PDF of the presentation at
> > http://groups.yahoo.com/group/stlr.... Look for the file
> > RubyTools.pdf.
> >
> > --
> > R. Mark Volkmann
> > Object Computing, Inc.
> >
> >
>
> Thank you very much.
> But the problem doesn't seem tobe resolved :/
> The only thing I had to add seems to be :
> %include "std_string.i"
>
> I did so, the compilation goes well, and seems to take the file into
> account.
> But the effect is still exactely the same...
>
> I tried your example, but had the following error when running the
> main.rb file :
>
> ruby: symbol lookup error: ./RubyPerson.so: undefined symbol:
> _ZN6PersonC1ERKSs

I'm not sure what else to suggest. If you'd like, tar up your code and
your build script, email it to me, and I'll try to get it to run.

--
R. Mark Volkmann
Object Computing, Inc.


killy-kun

3/20/2006 9:28:00 PM

0

> I'm not sure what else to suggest. If you'd like, tar up your code and
> your build script, email it to me, and I'll try to get it to run.
>
> --
> R. Mark Volkmann
> Object Computing, Inc.
>
>

Thank you very much for your proposition.
For the moment, the only thing I trying to make work is the str.i, where
all the code is included, and that is displayed below.
Here is what I tried :

#------------------------------#
[gnargeot@dptinfo ex3]$ cat str.i
%module str

%inline %{
#include <string>

using namespace std;

string fctBidon (const string& s)
{
string res;
res = s + " salt bidon";
return res;
}

string bidon()
{
string res = "bouh";
return res;
}

%}

%include "std_string.i"
[gnargeot@dptinfo ex3]$ swig -c++ -ruby *.i
[gnargeot@dptinfo ex3]$ set RBDIR = /usr/lib/ruby/1.8/i386-linux/
[gnargeot@dptinfo ex3]$ gcc -c -fpic *_wrap.cxx -I. -I$RBDIR
[gnargeot@dptinfo ex3]$ gcc -shared -fpic *_wrap.o -lstdc++ -o Str.so
[gnargeot@dptinfo ex3]$ irb --simple-prompt
>> require './Str.so'
LoadError: ./Str.so: undefined symbol: Init_Str - ./Str.so
from ./Str.so
from (irb):1
>> require './Str.so'
=> false
#------------------------------#

Hope I will manage to make this work :/
For the moment, it doesn't work at all, compared to my previous building
method, that used the Makefile provided in the examples directories of
the swig pack. But when building with these makefiles, I still had c++
strings recognized as "TYPE_p_string" ...

killy-kun

3/20/2006 9:34:00 PM

0

Sorry, I made an error last time, I corrected this :
replaced "%module Str" by "%module Str" into the str.i file.

Now the require instruction works fine, but the type "error" is still
the same :

#--------------------#
[gnargeot@dptinfo ex3]$ swig -c++ -ruby *.i
[gnargeot@dptinfo ex3]$ gcc -c -fpic *_wrap.cxx -I. -I$RBDIR
[gnargeot@dptinfo ex3]$ gcc -shared -fpic *_wrap.o -lstdc++ -o Str.so
[gnargeot@dptinfo ex3]$ irb --simple-prompt
>> require 'Str.so'
=> true
>> include Str
=> Object
>> bidon
=> #<SWIG::TYPE_p_string:0xb7efa238>
#--------------------#

Best regards,

Guillaume

Mark Volkmann

3/21/2006 4:31:00 AM

0

I've attached a zip that includes working code.
To build it, enter "build.sh". You may need to change the definition
of RBDIR in this file.
To use it from irb, enter these statements.

require 'RubyBidon.so'
include RubyBidon
bidon
fctBidon('foo')

This outputs
"bouh"
"foo salt bidon"

On 3/20/06, killy-kun <killy-kun@wanadoo.fr> wrote:
> Sorry, I made an error last time, I corrected this :
> replaced "%module Str" by "%module Str" into the str.i file.
>
> Now the require instruction works fine, but the type "error" is still
> the same :
>
> #--------------------#
> [gnargeot@dptinfo ex3]$ swig -c++ -ruby *.i
> [gnargeot@dptinfo ex3]$ gcc -c -fpic *_wrap.cxx -I. -I$RBDIR
> [gnargeot@dptinfo ex3]$ gcc -shared -fpic *_wrap.o -lstdc++ -o Str.so
> [gnargeot@dptinfo ex3]$ irb --simple-prompt
> >> require 'Str.so'
> => true
> >> include Str
> => Object
> >> bidon
> => #<SWIG::TYPE_p_string:0xb7efa238>
> #--------------------#
>
> Best regards,
>
> Guillaume
>
>


--
R. Mark Volkmann
Object Computing, Inc.