[gambit-list] c-array
Marc Feeley
feeley at iro.umontreal.ca
Sun Feb 15 00:14:28 EST 2009
On 14-Feb-09, at 11:58 PM, lowly coder wrote:
> question 1:
>
> Is it possible to write gambit code to produce the equiv of:
> int foo[200]; ?
>
> the current best I have in mind is:
> (let ((foo (malloc (* 200 8)))) ... )
>
>
> question 2:
> suppose I have:
>
> (c-define-type bar "bar")
>
> is there a way to create equiv of:
> bar foo[200]; ?
>
> again, current best I have in mind is:
> (let ((foo (malloc (* 200 sizeof_bar)))) ... )
>
>
> question 3:
>
> in question 1, is there a way to access foo[i] ?
>
> question 4:
>
> in question 2, is there a way to access foo[i] ?
>
> thanks!
Here's how I would do it:
(c-declare #<<end-of-c-declare
#include <stdlib.h>
int *malloc_int_array( int len )
{
return ___CAST( int*, malloc( len * sizeof(int) ) );
}
/*
for pure but slow version:
int int_array_ref( int *array, int i )
{
return array[i];
}
void int_array_set( int *array, int i, int val )
{
array[i] = val;
}
*/
end-of-c-declare
)
(c-define-type int* (pointer int))
(define malloc-int-array
(c-lambda (int) int* "malloc_int_array"))
; pure but slow version:
;
;(define int-array-ref
; (c-lambda (int* int) int "int_array_ref"))
;
;(define int-array-set!
; (c-lambda (int* int int) void "int_array_set"))
; faster version:
(define int-array-ref
(c-lambda (int* int) int "___result = ___arg1[___arg2];"))
(define int-array-set!
(c-lambda (int* int int) void "___arg1[___arg2] = ___arg3;"))
;; test it:
(define a (malloc-int-array 5))
(int-array-set! a 1 111)
(int-array-set! a 2 222)
(pp (+ (int-array-ref a 1) (int-array-ref a 2))) ;; 333
More information about the Gambit-list
mailing list