[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