[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | Damien Doligez <damien.doligez@i...> |
| Subject: | Re: [Caml-list] C interface style question |
On Jan 19, 2006, at 15:52, Olivier Andrieu wrote: > Thomas Fischbacher [Thursday 19 January 2006] : >> One more question about this: can I interface a C function in such >> a way that it uses an OCaml float array to store its output data, >> i.e. pass &(Double_field(ml_output,0)) as a double* "output >> parameter"? > > You can only do this on platform that accept doubles aligned on word > boundaries (such as x86). On those platforms, OCaml's config.h > undefines ARCH_ALIGN_DOUBLE. So your code might look like this : > > ,---- > | double *c_array; > | #ifdef ARCH_ALIGN_DOUBLE > | c_array = /* allocate temporary storage and copy the caml float > array */ > | #else > | c_array = (double *) ml_array; > | #endif > | > | /* use c_array */ > | > | #ifdef ARCH_ALIGN_DOUBLE > | free (c_array); > | #endif > `---- This is correct, except for the way you get the pointer. You should do it properly with &(Double_field(ml_array,0)). There is no guarantee that the value ml_array points to the first element of the array. Thomas wanted an "out" parameter, and the above code is for an "in" parameter, but it should work if you make the obvious changes. On Jan 19, 2006, at 16:15, Thomas Fischbacher wrote: > Is it (= will it always be) permissible to nest Field / Store_field > macros? If you are not doing some strange things, the Store_field will always be outermost, and some Fields will be nested inside it. In that case, it is safe. Otherwise, you're using C macros with arguments that have side-effects, and your program will never work anyway :-) -- Damien