Version française
Home     About     Download     Resources     Contact us    

This site is updated infrequently. For up-to-date information, please visit the new OCaml website at

Browse thread
Need help: O'Caml C Interface
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Jerome Vouillon <vouillon@c...>
Subject: Re: Need help: O'Caml C Interface

> value ocaml_getCharWidth(value code)
> {
>   double x, y;
>   Push_roots(r,1);
>   r[0] = alloc_tuple(2);
>   getCharWidth(Int_val(code),&x,&y);
>   Store_double_val(Field(r[0],0),x);
>   Store_double_val(Field(r[0],1),y);
>   Pop_roots();
>   return r[0];
> }

I would write it this way:

value ocaml_getCharWidth(value code)
  double x, y;
  value res;

  r[0] = copy_double(x);
  r[1] = copy_double(y);
  res = alloc_tuple(2);
  Field(res, 0) = r[0];
  Field(res, 1) = r[1];
  return res;

Store_double_val is used to store a double in an array of double values 
(which is a special kind of array). In other cases, you have to use 
copy_double to allocate a block containing the double.
So, your code failed because Field(r[0],0) was not a pointer to an array,
but an uninitialized pointer. 
*_roots are used to keep a pointer to both double values. Indeed, these
values can be moved by copy_double or alloc_tuple. The tuple is allocated
last, so that it can be directly filled (without having to use function