Greetings to everybody!
I have recently tried to use Gambit-C for interfacing OpenCascade (OCE) library which is written in C++. So, I am using Gambit-C based on g++ compiler. I have started with simple vector class i.e. gp_XY which has 2 members, x and y coordinate.
From OCE source:
inline void gp_XY::Add (const gp_XY& Other) { x += Other.x; y += Other.y; }
This is from my gpXY.scm :
(##namespace ("oce-gp-xy#"))
(##include "~~/lib/gambit#.scm")
(declare (standard-bindings) (block))
(c-declare #<<c-declare-end #include <gp_XY.hxx> extern "C" { typedef struct h_gp_XY h_gp_XY; typedef struct h_gp_Mat2d h_gp_Mat2d; h_gp_XY* gp_XY_create() { return reinterpret_cast<h_gp_XY*>(new gp_XY()); } h_gp_XY* gp_XY_create_ff(const Standard_Real x,const Standard_Real y) { return reinterpret_cast<h_gp_XY*>(new gp_XY(x,y)); } void gp_XY_destroy(h_gp_XY* h) { delete reinterpret_cast<gp_XY*>(h); } void my_add(gp_XY& Me, const gp_XY& Other) { Me.SetX(Me.X() + Other.X()); Me.SetY(Me.Y() + Other.Y()); } } c-declare-end )
(c-define-type XY "h_gp_XY") (c-define-type XY* (pointer XY)) (c-define-type Mat2d "h_gp_Mat2d") (c-define-type Mat2d* (pointer Mat2d)) ... ; problem with add (define add (c-lambda (XY* XY*) void #<<c-lambda-end const gp_XY& other = *(reinterpret_cast<gp_XY*>(___arg2)); gp_XY* th = reinterpret_cast<gp_XY*>(___arg1); th->Add(other); ; reinterpret_cast<gp_XY*>(___arg1)->Add(other); c-lambda-end ))
That file is compiled and linked with OCE libraries. And in gsi interpreter:
(load "gpXY")
"/home/emil/projects/scheme/gambit/oce/c++/src/gpXY.o1"
(##include "gpXY#.scm") (define p1 (create-ff 1.0 2.0)) (define p2 (create-ff 10.0 5.0)) (add p1 p2) (x p1)
21.
(y p1)
12.
Obviously there is bug somewhere, because results should be 11 and 7. So I wrote my_add function and it calculated add vector correctly. Is it something wrong in my code? I do not have experience in Gambit-C. Any help or hint will be appreciated.
Regards, Emil
Afficher les réponses par date