Hi Myles! In your case, you've announced int array in your C code, so you shouldn't use u8vector, the correct one is (u32vector 0 1 2 3 4 5 6 7 8 9) Please notice that 0 is the placeholder since your array starts from 1.
On Thu, Mar 12, 2020 at 4:22 AM Myles English <mylesengl...@gmail.com> wrote: > 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 > >>