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.

On Thu, Apr 16, 2009 at 9:30 PM, Marc Feeley <feeley@iro.umontreal.ca> wrote:

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.

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).

Marc