The correct way is to not let C manage memory at all ;-P
In the mpi egg, I used foreign-primitive and C_alloc as follows:

;; Returns the current MPI time as a floating-point number
(define MPI:wtime
  (foreign-primitive scheme-object ()
#<<EOF
  C_word result;
  C_word *ptr;

  ptr = C_alloc (C_SIZEOF_FLONUM);

  result = C_number(&ptr, MPI_Wtime());

  C_return (result);
EOF
))

In various other C interface libraries, I use the following idiom:

(define (func arg)

  ;; determine the size of the result vector
  (let* ((n (c_func_result_length arg))

    ;; allocate memory for the result vector
     (v (make-f64vector n 0.0)))

    ;; obtain result
    (c_func arg v)

    v))

This of course assumes that the C library you are targeting is structured
so as to allow you
to determine the result size. This is often the case with various numerical
libraries I have had to
interface to, but that's a fairly specific use case.


   -Ivan



On Thu, Jun 6, 2013 at 6:45 AM, Dan Leslie <[email protected]> wrote:

> Oh dear!
>
> Well, it works and I haven't had problems. What's the correct way to go
> about this?
>
> -Dan
>
>
> On 6/5/2013 2:36 PM, Felix wrote:
>
>> From: Dan Leslie <[email protected]>
>> Subject: Re: [Chicken-users] Chicken C interface
>> Date: Wed, 05 Jun 2013 08:47:45 -0700
>>
>>  I do this a fair bit in the Allegro egg.
>>>
>>> Here's an example:
>>> https://github.com/dleslie/**allegro-egg/blob/**
>>> 985ca2ceef0f5b4028af3f97729f13**cba2976fe5/color.scm<https://github.com/dleslie/allegro-egg/blob/985ca2ceef0f5b4028af3f97729f13cba2976fe5/color.scm>
>>>
>>> Basically, use C_alloc to allocate the memory required to host both
>>> the List structure and the data it is to contain, then use the C_list
>>> macro to patch it all together.
>>>
>> Note that this code is not correct: C_alloc allocates on the C stack and
>> the
>> data will be invalid once the function returns (Sorry). If this works,
>> then
>> it is just coincidental!
>>
>>
>> cheers,
>> felix
>>
>
>
> ______________________________**_________________
> Chicken-users mailing list
> [email protected]
> https://lists.nongnu.org/**mailman/listinfo/chicken-users<https://lists.nongnu.org/mailman/listinfo/chicken-users>
>
_______________________________________________
Chicken-users mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/chicken-users

Reply via email to