Hi Nala, On Tue, 10 Mar 2020, 18:50 Nala Ginrut, <nalagin...@gmail.com> wrote:
> If I understand your question correctly, the arg_type should be (list int > '*) > > On Tue, Mar 10, 2020 at 10:25 PM Myles English <mylesengl...@gmail.com> > wrote: > I am trying to call a C function with this signature from Guile: > >> >> void the_test(int n, const int the_array[]); >> >> in pointer->procedure what should arg_types be? >> > Thank you for reply, it does indeed answer my original question. Now, how do I call the guile procedure to use the C function? I thought this might work but it doesn't: In file main.scm: (use-modules (system foreign) (rnrs bytevectors)) (define libarray (dynamic-link "/path/to/libarray.so")) (define the-test (pointer->procedure void (dynamic-func "the_test" libarray) (list int '*))) (define (call-the-test) (let* ((bv (u8-list->bytevector '(1 2 3 4 5 6 7 8 9))) (bv_p (bytevector->pointer bv))) (display bv) (newline) (the-test 9 bv_p))) (call-the-test) In file array.c: #include <stdio.h> void the_test(int n, const int the_array[]) { int i, k; for (k = 1; k <= n; k++) { i = the_array[k]; printf("the_array [%d] = %d\n", k, i); } return; } compiled with: gcc -c -Wall -fpic array.c && gcc -shared -o libarray.so array.o This is the result of calling the guile module, (I was hoping to get the numbers 1 to 9): $ guile main.scm #vu8(1 2 3 4 5 6 7 8 9) the_array [1] = 134678021 the_array [2] = 9 the_array [3] = 0 the_array [4] = 0 the_array [5] = 0 the_array [6] = 0 the_array [7] = 0 the_array [8] = 27 the_array [9] = 0 In addition to the main question above, the C function expects a 1-based index for the array, how would the guile procedure accommodate this? Thanks, Myles >