Hello Thomas,
Below you provide the example function 'inc_int' and ask what you should pass to it. You should pass it a pointer to an int of course. :-) And where do you get such an object? You can make one with another c-lambda based function. For example:
(define make-int-box (c-lambda () int* "___result = malloc(sizeof( int ));"))
So now you can do:
(define i (make-int-box)) (inc_int i)
There is a problem... the int box doesn't contain anything to increment. So we should have a way to set the value inside the box. We also need a way to access the contents of the box. These functions do these:
(define set-int-box (c-lambda (int* int) void "*___arg1 = ___arg2;"))
(define val-int-box (c-lambda (int*) int "___result = *___arg1;"))
That should get you started.
The atomic code I announced a few days ago contains a macro called 'c-box' that works like this:
(c-box int)
Now you can do this:
;; Make a new int box (define i (new-int-box)) ;; Set the value of the box: [i val: 0] ;; Call your inc_int to increment the value in the box (inc_int [i box:]) ;; Print the new value: [i val:]
Happy Hacking
Ed Cavazos
On 31 Dec 2004 17:39:20 +0100, Thomas Hafner thomas@hafner.nl.eu.org wrote:
Some given C functions receive pointers and manipulate the memory where the pointers are pointing to. How should my c-lamda expression look like to mach that requirement?
Here's a simple example (not real, but to show my problem). If the given C Funktion looks like that: void inc_int(int *pI) { (*pI)++; }
Is it then Ok to use it from Gambit 4.0 beta 11 like follows? (define inc-int (c-lambda ((pointer int)) void "inc_int"))
If yes: what can I pass to inc-int? How to express the Scheme equivalent to the C pointer?
Otherwise: how should my Scheme procedure definition look like? Of course the example above is a very simple one. A good solution should also work with more complicated C functions, e.g. of type int () (int *, char **).
Regards Thomas Hafner
Gambit-list mailing list Gambit-list@iro.umontreal.ca http://mailman.iro.umontreal.ca/mailman/listinfo/gambit-list