ocaml / graphics

The Graphics library from OCaml, in a standalone repository
Other
56 stars 29 forks source link

Graphics crash under Windows #6

Open vicuna opened 7 years ago

vicuna commented 7 years ago

Original bug ID: 7419 Reporter: Anax Assigned to: @dra27 Status: assigned (set by @dra27 on 2016-11-22T15:49:09Z) Resolution: open Priority: normal Severity: minor Platform: Winodws OS: Windows 10 Version: 4.02.3 Category: platform support (windows, cross-compilation, etc) Monitored by: @gasche

Bug description

In class, we did some exercices on trees, and in the fil the teacher gave us, there were a function to trace trees (the fact that it is tree is not important). I don't really know the module graphics.cma, but when I use it to trace a forest here, the forest is tarced, but when I when to close the windows with the space bar (there is the code let _ = read_key() in close_graph() at the end of the function) it crashes I have to launch again ocaml. I use Windows 10 on my computer, and a friend of mine as the same problem on his Windows. At school, we use ubuntu and it works.

Steps to reproduce

As I don't really know how really works the graphics module, I give you the caml function :

let rec trace_arbre_binaire t (xmin, xmax, ymin, ymax) h =
    match t with
    | Vide -> ()
    | Noeud_Binaire (x, t1, t2) ->
            let dy = (ymax - ymin) / h in
            let xm = (xmin + xmax) / 2 in
            let s = string_of_int x in
            moveto (xm - (10 * String.length s) / 2)  ymax;
            set_color green;
            draw_string s;
            let dx = (xmax - xmin) / 2 in
            set_color yellow;
            if t1 <> Vide then (
                moveto xm (ymax - 5);
                lineto (xmin + dx / 2) (ymax - dy + 15);
            );
            if t2 <> Vide then (
                moveto xm (ymax - 5);
                lineto (xmin + dx / 2 + dx) (ymax - dy + 15);
            );
            trace_arbre_binaire t1 (xmin, xm, ymin, ymax - dy) (h - 1);
            trace_arbre_binaire t2 (xm, xmax, ymin, ymax - dy) (h - 1)

let voir_arbre_binaire t =
    let nx = 800
    and ny = 600 in
    open_graph (" " ^ (string_of_int nx) ^ "x" ^ (string_of_int ny));
    set_color black;
    fill_rect 0 0 nx ny;
    let k = 50 in
    trace_arbre_binaire t (k,nx - k,k,ny - k) (hauteur_arbre_binaire t);
    let _ = read_key() in close_graph();;

where the type 'a arbre is

type 'a arbre_binaire =
|  Vide
|  Noeud_Binaire of 'a * 'a arbre_binaire * 'a arbre_binaire

Additional information

(I'm a French student, so I apologize for my apporxiamtive English)

File attachments

vicuna commented 7 years ago

Comment author: @dra27

64-bit OCaml?

I'm fairly sure you hitting a bug fixed in #678 (https://github.com/ocaml/ocaml/pull/678). If you're building OCaml from source, there is a version of this patch back-ported for 4.02.3 at https://github.com/metastack/ocaml-legacy/blob/master/GPR678.patch

vicuna commented 7 years ago

Comment author: @dra27

(self-assigned as a reminder to check that 4.04 doesn't exhibit this behaviour - if someone else beats me to it, feel free to close this PR)

gasche commented 5 years ago

@dra27 if/when you have time, checking that 4.07 doesn't exhibit this behavior would be nice :-)

ghost commented 5 years ago

Sure. I guess that would be 4.09 though. We are planning to make this library available for OCaml >= 4.09 only.