I'm really glad you mentioned this .... I got to this point:
(include "gl-header.scm")
(c-declare #<<c-declare-end
#include <GL/gl.h>
c-declare-end
)
(define u32-vector->uint*
(c-lambda (scheme-object) GLuint* "___result = ___CAST(GLuint*,&___FETCH_U32(___BODY(_\
__arg1),___INT(0)));"))
... and yeah, now I'm going to scratch it. Wasn't aware the gc moved stuff around. Thanks! I can only imagine how fun this bug would have been to debug.
That would be problematic because objects in the Scheme heap, including vectors, can be moved by the garbage collector. So a C pointer to an element of a u32vector could become stale (dangling pointer) at any moment. The only way this could work is to allocate a "still" vector. But all of this is seriously asking for trouble (the pointer will be a dangling pointer when the still object is reclaimed).
On 17-Apr-09, at 12:19 AM, lowly coder wrote:
Hi!
This is a different question from my previous silly question.
All though it's really cool that I can take a C function with signature:
void foo(int *);
and in scheme land create a (scheme-foo) so that I can do:
(define bar (make-u....vector ...))
(scheme-foo bar)
There are a lot of C functions I need to use that take arguments int*, short*, ...
I would prefer to not change all these C bindings, and somehow magically have a Scheme function that given:
(uber-magic bar)
returns me a int* corresponding to where the data is stored in u32-vector bar.
Marc