[racket] using s16vector-set! on malloc'ed values
At Fri, 25 Oct 2013 14:28:13 -0700, John Clements wrote:
> Unsafe-s16vector-set! is *MUCH* faster than ptr-set!. About 10x faster,
> apparently.
>
> In the rsound package, I want to use unsafe-s16vector-set! on a region of
> memory that's allocated by malloc--or, more specifically, the malloc
> associated with a dll, because windows cares about things like this.
>
> Here's some code that doesn't work:
>
> #lang racket
>
> (require ffi/unsafe
> ffi/vector)
>
> (define ptr (malloc 1000))
>
> (s16vector-set! ptr 0 2244)
>
> In fact, it causes a seg fault.
The program above gives
s16vector-set!: expected argument of type <s16vector>; given: #<cpointer>
but if you use `unsafe-s16vector-set!` (as suggested further above),
then you're likely to get a seg fault.
> If I understand correctly, this is because this is taking the "pointer
> value"--probably an 8-byte or 16-byte structure that holds a pointer--and
> treats it like it's a massive s16vector.
Not quite. Both a plain pointer and an `s16vector` value are
represented as a wrapper that points to the actual array, but the
pointer is in a slightly different place inside each kind of wrapper.
Using `cast` to convert from a raw pointer to an `_s16vector`
effectively converts the wrapper:
(define ptr (cast (malloc 1000)
_pointer
(_s16vector o 500)))