[gambit-list] Interfacing C++

David St-Hilaire sthilaid at iro.umontreal.ca
Mon May 21 13:06:30 EDT 2007


Hi all,

I'm still trying to interface the same c++ 3d engine with gambit and I 
am currently encountering some problems which seems out of my range of 
knowledge... I'm currently trying to define a type corresponding to a 2d 
position which I would like to interface with a simple scheme vector. 
Here is the code I wrote for it:

    (c-declare #<<c-declare-end

    typedef position2d<s32> position2d_s32;

    ___SCMOBJ SCMOBJ_to_POSITION2D_S32 (___SCMOBJ src, position2d_s32
    *dst, int arg_num)
    {
    ___SCMOBJ ___err = ___FIX(___NO_ERR);
    ___SCMOBJ ___temp;

    if (!(___S32VECTORP(src) && (___S32VECTORLENGTH(src) == ___FIX(2))))
    ___err = ___FIX(___UNKNOWN_ERR);
    else
    {
    dst->X = ___S32VECTORREF(src,___FIX(0));
    dst->Y = ___S32VECTORREF(src,___FIX(1));
    }
    return ___err;
    }

    ___SCMOBJ POSITION2D_S32_to_SCMOBJ (position2d_s32 src, ___SCMOBJ
    *dst, int arg_num)
    {
    ___SCMOBJ ___err = ___FIX(___NO_ERR);
    *dst = ___alloc_scmobj (___sS32VECTOR, 2<<3, ___STILL);
    if (___FIXNUMP(*dst))
    ___err = ___FIX(___CTOS_HEAP_OVERFLOW_ERR+arg_num);
    else
    {
    ___S32VECTORSET(*dst,___FIX(0),src.X)
    ___S32VECTORSET(*dst,___FIX(1),src.Y)
    }
    return ___err;
    }

    #define ___BEGIN_CFUN_SCMOBJ_to_POSITION2D_S32(src,dst,i) \
    if ((___err = SCMOBJ_to_POSITION2D_S32 (src, &dst, i)) ==
    ___FIX(___NO_ERR)) {
    #define ___END_CFUN_SCMOBJ_to_POSITION2D_S32(src,dst,i) }

    #define ___BEGIN_CFUN_POSITION2D_S32_to_SCMOBJ(src,dst) \
    if ((___err = POSITION2D_S32_to_SCMOBJ (src, &dst, ___RETURN_POS))
    == ___FIX(___NO_ERR)) {
    #define ___END_CFUN_POSITION2D_S32_to_SCMOBJ(src,dst) \
    ___EXT(___release_scmobj) (dst); }

    #define ___BEGIN_SFUN_POSITION2D_S32_to_SCMOBJ(src,dst,i) \
    if ((___err = POSITION2D_S32_to_SCMOBJ (src, &dst, i)) ==
    ___FIX(___NO_ERR)) {
    #define ___END_SFUN_POSITION2D_S32_to_SCMOBJ(src,dst,i) \
    ___EXT(___release_scmobj) (dst); }

    #define ___BEGIN_SFUN_SCMOBJ_to_POSITION2D_S32(src,dst) \
    { ___err = SCMOBJ_to_POSITION2D_S32 (src, &dst, ___RETURN_POS);
    #define ___END_SFUN_SCMOBJ_to_POSITION2D_S32(src,dst) }

    c-declare-end
    )

    (c-define-type position2d_s32 "position2d_s32"
    "POSITION2D_S32_to_SCMOBJ"
    "SCMOBJ_to_POSITION2D_S32"
    #f)

This code is a mere quasi-copy of one of Marc Feeley's code which 
originally was:

    (c-declare #<<c-declare-end

    ___SCMOBJ SCMOBJ_to_VECTOR3DF (___SCMOBJ src, vector3df *dst, int
    arg_num)
    {
    ___SCMOBJ ___err = ___FIX(___NO_ERR);
    ___SCMOBJ ___temp;
    if (!(___F64VECTORP(src) && (___F64VECTORLENGTH(src) == ___FIX(3))))
    ___err = ___FIX(___UNKNOWN_ERR);
    else
    {
    dst->X = ___F64VECTORREF(src,___FIX(0));
    dst->Y = ___F64VECTORREF(src,___FIX(1));
    dst->Z = ___F64VECTORREF(src,___FIX(2));
    }
    return ___err;
    }

    ___SCMOBJ VECTOR3DF_to_SCMOBJ (vector3df src, ___SCMOBJ *dst, int
    arg_num)
    {
    ___SCMOBJ ___err = ___FIX(___NO_ERR);
    *dst = ___alloc_scmobj (___sF64VECTOR, 3<<3, ___STILL);
    if (___FIXNUMP(*dst))
    ___err = ___FIX(___CTOS_HEAP_OVERFLOW_ERR+arg_num);
    else
    {
    ___F64VECTORSET(*dst,___FIX(0),src.X)
    ___F64VECTORSET(*dst,___FIX(1),src.Y)
    ___F64VECTORSET(*dst,___FIX(2),src.Z)
    }
    return ___err;
    }

    #define ___BEGIN_CFUN_SCMOBJ_to_VECTOR3DF(src,dst,i) \
    if ((___err = SCMOBJ_to_VECTOR3DF (src, &dst, i)) ==
    ___FIX(___NO_ERR)) {
    #define ___END_CFUN_SCMOBJ_to_VECTOR3DF(src,dst,i) }

    #define ___BEGIN_CFUN_VECTOR3DF_to_SCMOBJ(src,dst) \
    if ((___err = VECTOR3DF_to_SCMOBJ (src, &dst, ___RETURN_POS)) ==
    ___FIX(___NO_ERR)) {
    #define ___END_CFUN_VECTOR3DF_to_SCMOBJ(src,dst) \
    ___EXT(___release_scmobj) (dst); }

    #define ___BEGIN_SFUN_VECTOR3DF_to_SCMOBJ(src,dst,i) \
    if ((___err = VECTOR3DF_to_SCMOBJ (src, &dst, i)) ==
    ___FIX(___NO_ERR)) {
    #define ___END_SFUN_VECTOR3DF_to_SCMOBJ(src,dst,i) \
    ___EXT(___release_scmobj) (dst); }

    #define ___BEGIN_SFUN_SCMOBJ_to_VECTOR3DF(src,dst) \
    { ___err = SCMOBJ_to_VECTOR3DF (src, &dst, ___RETURN_POS);
    #define ___END_SFUN_SCMOBJ_to_VECTOR3DF(src,dst) }

    c-declare-end
    )

    (c-define-type vector3df "vector3df"
    "VECTOR3DF_to_SCMOBJ"
    "SCMOBJ_to_VECTOR3DF"
    #f)

Marc's code worked perfectly fine, but mine compiles from scm to c, but 
won't from .c to object file .o. The error message I get from g++ is the 
following:

    gsc -c irr-interface.scm
    g++ -rdynamic -I/opt/g4/current/include
    -I/home/dave/irrlicht-1.3/include -I/usr/X11R6/include
    -D___SINGLE_HOST -O3 -ffast-math -c irr-interface.c
    irr-interface.c: In function ‘int SCMOBJ_to_POSITION2D_S32(int,
    position2d_s32*, int)’:
    irr-interface.c:995: error: ‘___s32_temp’ was not declared in this scope
    irr-interface.c:995: error: ‘___hp’ was not declared in this scope
    irr-interface.c: In function ‘int
    POSITION2D_S32_to_SCMOBJ(position2d_s32, int*, int)’:
    irr-interface.c:1009: error: ‘___temp’ was not declared in this scope

I don't understant why the almost exact same definitions works with 
F64VECTOR but not with S32VECTOR... Can anyone help me??

Thank you!

David St-Hilaire



More information about the Gambit-list mailing list