Le jeudi 05 avril 2012 07:57:45, Anthony Tavener a écrit : > I'm trying to determine the size of a Bigarray, in bytes. > > I've tried several things... ending up with this as the only solution: > > -------------------------- > let ba_char = Hashtbl.hash Bigarray.char;; > let ba_int8_signed = Hashtbl.hash int8_signed;; > let ba_int8_unsigned = Hashtbl.hash int8_unsigned;; > let ba_int16_signed = Hashtbl.hash int16_signed;; > let ba_int16_unsigned = Hashtbl.hash int16_unsigned;; > let ba_int32 = Hashtbl.hash Bigarray.int32;; > let ba_float32 = Hashtbl.hash float32;; > let ba_int64 = Hashtbl.hash Bigarray.int64;; > let ba_float64 = Hashtbl.hash float64;; > let ba_complex32 = Hashtbl.hash complex32;; > let ba_complex64 = Hashtbl.hash complex64;; > let ba_int = Hashtbl.hash Bigarray.int;; > let ba_nativeint = Hashtbl.hash Bigarray.nativeint;; > > let bigarray_bytes ba = > let elt_bytes = match Hashtbl.hash (Array1.kind ba) with > > | x when x=ba_char || x=ba_int8_signed || x=ba_int8_unsigned -> 1 > | x when x=ba_int16_signed || x=ba_int16_unsigned -> 2 > | x when x=ba_int32 || x=ba_float32 -> 4 > | x when x=ba_int64 || x=ba_float64 || x=ba_complex32 -> 8 > | x when x=ba_complex64 -> 16 > | x when x=ba_int || x=ba_nativeint -> > > Nativeint.size lsr 8 > > | _ -> failwith "Unknown Bigarray kind." > > in (Array1.dim ba) * elt_bytes;; > -------------------------- > > Which is a rather ugly hack! It feels dirty like Obj.magic, while being > completely inelegant, and even has a fail case! Can't get much worse. :) > Of course, internally, bigarray will know it's own size... sometimes the > price of abstraction... *sigh* > > I found a related Mantis entry from 6 years back: > http://caml.inria.fr/mantis/view.php?id=3962 > > Well... does anyone have some better suggestions? Please? :) > Oh, I can make it look a little prettier by plugging in the constants eked > out by Hashtbl.hash. ;D > > Why do I want this? Interfacing with OpenGL (glcaml). > > Thanks for looking, and more again if you have a good tip!
Hi Anthony, Had the same problem with glMLite. I use the function below, but if there is a better solution I would be interested too: val ba_sizeof: ba:('a, 'b, Bigarray.c_layout) Bigarray.Array1.t -> int external elem_size: ba:('a, 'b, Bigarray.c_layout) Bigarray.Array1.t -> int = "ml_ba_elem_size" "noalloc" let ba_sizeof ~ba = ((Bigarray.Array1.dim ba) * (elem_size ba)) ;; CAMLprim value ml_ba_elem_size( value _ba ) { struct caml_bigarray *ba = Bigarray_val(_ba); int size; switch (ba->flags & BIGARRAY_KIND_MASK) { case BIGARRAY_SINT8: case BIGARRAY_UINT8: size = 1; break; case BIGARRAY_SINT16: case BIGARRAY_UINT16: size = 2; break; case BIGARRAY_INT32: case BIGARRAY_FLOAT32: case BIGARRAY_COMPLEX32: size = 4; break; case BIGARRAY_INT64: case BIGARRAY_FLOAT64: case BIGARRAY_COMPLEX64: size = 8; break; case BIGARRAY_CAML_INT: case BIGARRAY_NATIVE_INT: size = sizeof(value); break; } return Val_int(size); } -- Caml-list mailing list. Subscription management and archives: https://sympa-roc.inria.fr/wws/info/caml-list Beginner's list: http://groups.yahoo.com/group/ocaml_beginners Bug reports: http://caml.inria.fr/bin/caml-bugs