This error seems wrong:

#lang racket

(require ffi/unsafe
         ffi/unsafe/cvector)

(define-cstruct _mpz ([alloc _int]
                      [size _int]
                      [limbs (_gcable _cvector)]))

(define z (make-mpz 1 1 (list->cvector '(1) _long)))
(mpz-limbs z)

>>> _cvector: cannot automatically convert a C pointer to a cvector


The error might be correct, though late and confusing, if a cvector's "base representation" isn't a pointer type. Is it?

If that error is correct, then how are FFI users meant to define a C struct that has a "long *" field that points to an array? I've not yet managed to define one whose instances survive a garbage collection cycle without using (_gcable _cvector). Here's one of my desperate attempts:


#lang racket

(require ffi/unsafe
         ffi/unsafe/cvector)

(define-cstruct _mpz ([alloc _int] [size _int] [limbs _gcpointer]))

(define z (make-mpz 1 1 (cvector-ptr (list->cvector '(1) _long))))

> (ptr-ref (mpz-limbs z) _long 0)
1
> (collect-garbage)
> (ptr-ref (mpz-limbs z) _long 0)
139856348920568


I mean to be complain-y this time. This shouldn't be this hard to figure out.

Neil ⊥
_________________________
 Racket Developers list:
 http://lists.racket-lang.org/dev

Reply via email to