I'm trying to use ___S32VECTORREF as ___F32VECTORREF was illustrated previously on this list. The rest of my code works fine, and if I use float homogenous arrays, that works.
___SCMOBJ shared_array;
...
int ival = ___S32VECTORREF(shared_array, i);
I've also tried
int ival = ___S32VECTORREF(shared_array, ___FIX(i));
Both result in:
Line Location scheme-bridge.c:66: error: '___hp' undeclared (first use in this function) Line Location scheme-bridge.c:66: error: '___s32_temp' undeclared (first use in this function)
It's not clear to me from the macro definitions in gambit.h how to get around this.
Any help appreciated.
- Tom
Afficher les réponses par date
On 5-Apr-09, at 10:12 PM, tom@tmilford.com tom@tmilford.com wrote:
I'm trying to use ___S32VECTORREF as ___F32VECTORREF was illustrated previously on this list. The rest of my code works fine, and if I use float homogenous arrays, that works.
___SCMOBJ shared_array;
...
int ival = ___S32VECTORREF(shared_array, i);
I've also tried
int ival = ___S32VECTORREF(shared_array, ___FIX(i));
Both result in:
Line Location scheme-bridge.c:66: error: '___hp' undeclared (first use in this function) Line Location scheme-bridge.c:66: error: '___s32_temp' undeclared (first use in this function)
It's not clear to me from the macro definitions in gambit.h how to get around this.
___F4VECTORREF returns a C double, i.e. it is *not* a boxed (heap allocated) flonum.
___S32VECTORREF returns a Scheme exact integer (the C type ___SCMOBJ defined in include/gambit.h). The thing is that if the 32 bit value is larger than a fixnum, then a heap allocated bignum must be created. This is why ___hp ("heap pointer") is needed in general. You can't easily access it from arbitrary C code because there is some non-trivial interaction with polling, heap-overflow checking, and garbage-collecting.
In any case, from the looks of your code, this is probably not what you wanted to do. You want a C 32 bit integer, not a Scheme 32 bit integer.
So try:
___S32 *s32ptr = ___CAST(___S32*,___BODY_AS(shared_array,___tSUBTYPED)); ___S32 ival = s32ptr[i];
Note that it is better to use ___S32 instead of "int", because "int" is not guaranteed to be a 32 bit integer in all C environments.
Marc