Re: Accessing elements in foreign array of structs

"Erik Ronström (as erik dot ronstrom at doremir dot com)" <[email protected]> Mon, 13 Apr 2026 08:57:00 +0200
Newsgroups gmane.lisp.lispworks.general
Message-ID <[email protected]>
Thanks, that will also work!

(Although I'm still puzzled; it feels like there *has to* be some way to 
index directly into a struct member of an array!?)

Erik


Den 2026-04-12 kl. 22:53, skrev Julian Baldwin (as julian at jbaldwin 
dot net):
> Sorry spam (original reply didn’t include the mailing list), but does 
> something like this work?
>
> (use-package "FLI")
>
> (define-c-struct (point (:foreign-name "tagPOINT"))
>   (x :long)
>   (y :long))
>
> (with-dynamic-foreign-objects ((points point :nelems 3))
>   (let ((current (copy-pointer points)))
>     (dotimes (index 3)
>       (setf (foreign-slot-value current 'x :object-type 'point) index
>             (foreign-slot-value current 'y :object-type 'point) index)
>       (format t "~S: ~S ~S,~S~%"
>               index
>               current
>               (foreign-slot-value current 'x)
>               (foreign-slot-value current 'y))
>       (incf-pointer current))))
>
> The compiler can optimise slot access if you pass the :object-type, 
> but it’s not strictly necessary.
>
> Julian.
>
>
> ------ Original Message ------
> From "Erik Ronström (as erik dot ronstrom at doremir dot com)" 
> <[email protected]>
> To "LispWorks" <[email protected]>
> Date 13/4/2026 4:53:18 am
> Subject Accessing elements in foreign array of structs
>
>> Hi,
>> I am calling a foreign function that takes an array of points as input.
>> (fli:define-c-struct (point (:foreign-name "tagPOINT"))
>>   (x :long)
>>   (y :long))
>> (let ((points (fli:allocate-foreign-object :type 'point :nelems 3)))
>> (the-foreign-function points))
>> I can't figure out how to access the elements of the foreign array 
>> directly.
>> This works:
>> (let ((p (fli:allocate-foreign-object :type 'point)))
>> (setf (fli:foreign-slot-value p 'x) 100
>> (fli:foreign-slot-value p 'y) 200
>> (fli:dereference points :index 0) p)
>> But how do I set the elements of points without using an intermediate 
>> object?
>> Erik