On Jan 13, 2015, at 1:48 PM, Jacob Horrocks neggy6@gmail.com wrote:
Hi Gambit.
I'm new to C programming, and am struggling in thinking up a way to wrap c functions that have out parameters via pointers. My strongest desire would to be able to call a c-lambda like-so:
(receive return-value-1 return-value-2 (my-c-lambda-wrapper-call some args) ....)
But I am completely stumped.
Thanks for any help/advice you can give.
Returning multiple values from a C function can be accomplished by passing a preallocated vector to the C function and having the C function fill the content of the vector with the values to return. Here is an example.
Marc
(c-declare "
void add_mul(int x, int y, ___SCMOBJ res) {
int add = x+y; int mul = x*y;
___VECTORSET(res, ___FIX(0), ___FIX(add)) ___VECTORSET(res, ___FIX(1), ___FIX(mul)) } ")
(define (add-mul x y) (let ((res (vector 0 0))) ((c-lambda (int int scheme-object) void "add_mul") x y res) (values (vector-ref res 0) (vector-ref res 1))))
(receive (add mul) (add-mul 3 7) (pp (list 'add= add 'mul= mul)))
;; prints: (add= 10 mul= 21)