I'd like suggestions for improving the following function:
(define-cstruct _Slice
([start _intptr]
[end _intptr]
[stride _intptr]))
;; provide the number of dimensions and a list of triples(start end stride)
;; returns a cpointer to an array of _Slices
(define (make-slice nd range-lst)
(define slice-ptr
(vector->cblock
(for/vector #:length nd
([r (in-list range-lst)])
(apply make-Slice r))
_Slice))
(set-cpointer-tag! slice-ptr 'Slice)
slice-ptr)
The make-slice
function is used to provide an argument to a C function that takes a Slice *
pointer. The function accepts NULL as a valid argument. This works for my needs, but I have two questions:
1 ) Is there a better way to allocate an array of C structs on the Racket side?
_fun
has forms to automatically accept vectors and convert them to cpointers but I don't think that will work for NULL pointer arguments.
Is there a better way to do this using _array
? I couldn't figure out how to use arrays with C structs since make-Slice
(the function created by define-cstruct
) returns a pointer to a _Slice
and not the data. So I can't create an array and set each element with array-set!
.
2 ) Is there a way to set the cpointer tag automatically? Manually doing it here is a bit awkward, but hopefully correct.
It seems like vector->cblock
could do it since it knows the type.
Ideas are appreciated! Overall the C FFI is pretty nice and I've been enjoying working with it. But it is a fairly large API and sometimes I get lost in the docs.