[gambit-list] C-FFI pointers in c function arguments

Sid H shortsightedsid at gmail.com
Fri Nov 19 03:06:46 EST 2010


Hi,

I'm just starting with the FFI. I'm trying to call a C function that updates a
pointer argument. However, that value does not seem to change.

My understanding is that all arguments passed to C are treated as immutable. So,
if we need to return any value from C then, it cannot be via an argument only.
Is that correct? Please see my example below.

(c-declare #<<c-declare-end

#include <stdio.h>

int get_value(int* value)
{
    if(NULL != value) {
        *value = 42;
    } else {
        printf("Invalid pointer");
    }

    return 21;
}

c-declare-end
)

(c-define-type int* (pointer int))

(define get-value (c-lambda (int*) int "get_value"))

;; Define a Wrapper in C 
(define %get-value (c-lambda () int
#<<C-END
   int tmp;
   int retval = get_value(&tmp);

   /* TODO: Handle retval inside the C Wrapper code */

   ___result = tmp;
C-END
))
    
;; Can we update a pointer via a c function call arg?
(define value #f)
(let ((retval (get-value value)))
  (if (eq? retval 21)
      (begin 
	(display value) ; Prints #f
	(newline))
      (begin
	(display "Did not get 21 as return value")
	(newline))))

; Now use the wrapper API instead
(set! value (%get-value)) 
(display value) ; No surprise, prints 42
(newline)

Thanks,
Sid




More information about the Gambit-list mailing list