-------------------exC.c------------------------------ #include extern void my_c_function(double * data, int dimx, int dimy); void my_c_function (double * data, int dimx, int dimy) { int i,j; printf("\n\n"); for(i=0; idim[0]; int dimy = Bigarray_val(bigarray)->dim[1]; my_c_function(Data_bigarray_val(bigarray), dimx, dimy); return Val_unit; } value sommeC (value x, value y) { int cx = Int_val(x); int cy = Int_val(y); int res = cx + cy; printf("=> %d + %d = %d\n",cx,cy,res); return(res); } -------------------exOcaml.ml------------------------------ external somme : int -> int -> int = "sommeC";; print_int (somme 2 23);; print_newline();; external afftab : (int, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array2.t -> unit = "camlStub";; exception Out_of_range class big_img w h = object (this) val mutable width = w val mutable height = h val pixels = Bigarray.Array2.create Bigarray.int8_unsigned Bigarray.c_layout w h method get_width = width method get_height = height method get_pixels = pixels method get_pixel x y = pixels.{x, y} method set_pixels array = Bigarray.Array2.blit array pixels method set_pixel x y v = if (x >= 0 && y >= 0 && x < width && y < height) then pixels.{x, y} <- v else raise Out_of_range (* Fills this object with a function (int -> int -> int) *) method fill f = for i = 0 to width - 1 do for j = 0 to height - 1 do pixels.{i, j} <- f i j done done (* Returns the surrounding coordinates *) (* from a point in a list in an array *) method get_surround_coord xy size = let surround = ref [] in ( match xy with (x, y) -> ( for i = 0 - (size / 2) to 0 + (size / 2) do for j = 0 - (size / 2) to 0 + (size / 2) do surround := (x - j, y - i)::!surround done done ) ); !surround (* Gets the values from the list *) (* that you provide *) method get_values_from_list list = match list with [] -> [] | (x,y)::t -> begin try (pixels.{x, y})::(this#get_values_from_list t) with _ -> this#get_values_from_list t end method pretty_print_or_not = for i = 0 to height - 1 do print_string "@ "; for j = 0 to width - 1 do if pixels.{j, i} > 255/2 then print_string "X" else print_string " " done; print_string " @\n" done; print_string "\n\n\n" end let _ = let bla = new big_img 12 12 in bla#fill (fun x y -> 0); bla#pretty_print_or_not; bla#set_pixel 2 1 255; bla#set_pixel 3 1 255; bla#set_pixel 4 1 255; bla#set_pixel 5 1 255; bla#set_pixel 1 2 255; bla#set_pixel 2 2 255; bla#set_pixel 3 2 255; bla#set_pixel 4 2 255; bla#set_pixel 5 2 255; bla#set_pixel 1 3 255; bla#set_pixel 2 3 255; bla#set_pixel 3 3 255; bla#set_pixel 4 3 255; bla#set_pixel 5 3 255; bla#set_pixel 1 4 255; bla#set_pixel 2 4 255; bla#set_pixel 3 4 255; bla#set_pixel 4 4 255; bla#set_pixel 1 5 255; bla#set_pixel 2 5 255; bla#set_pixel 3 5 255; bla#set_pixel 4 5 255; bla#set_pixel 8 5 255; bla#set_pixel 10 5 255; for i = 1 to 10 do bla#set_pixel i 6 255 done; for i = 4 to 10 do bla#set_pixel i 7 255 done; for i = 5 to 9 do bla#set_pixel i 8 255 done; for i = 6 to 8 do bla#set_pixel i 9 255 done; for i = 6 to 7 do bla#set_pixel i 10 255 done; bla#pretty_print_or_not; afftab bla#get_pixels; print_newline();; -------------------makefile------------------------------ test: cc -c -I /usr/local/lib/ocaml exC.c ocamlopt bigarray.cmxa exC.o exOcaml.ml -o ex