为什么按numlock会崩溃OCaml opengl程序?

时间:2010-08-13 15:59:24

标签: exception opengl ocaml

我对openGL没有任何经验,所以也许我只是遗漏了一些东西。

我使用lablGL有这个ocaml代码。要编译我使用

ocamlopt -I + lablGL lablglut.cmxa lablgl.cmxa gl.ml -o gl.opt

ocamlc -I + lablGL lablglut.cma lablgl.cma gl.ml -o gl.byte

let keyboard ~key ~x ~y =
  match key with
    | 27 -> exit 0
    | _ -> ignore (Printf.printf "Key: %c %d pressed.\n%!" (char_of_int key) key)
;;

let keyboard_up ~key ~x ~y =
  match key with
    | _ -> ignore (Printf.printf "Key: %c %d released.\n%!" key (int_of_char key))
;;

let special ~key ~x ~y =
  try
    match key with
      | Glut.KEY_F1 -> Printf.printf "F1 pressed.\n%!"
      | Glut.KEY_F2 -> Printf.printf "F2 pressed.\n%!"
      | Glut.KEY_F3 -> Printf.printf "F3 pressed.\n%!"
      | Glut.KEY_F4 -> Printf.printf "F4 pressed.\n%!"
      | Glut.KEY_F5 -> Printf.printf "F5 pressed.\n%!"
      | Glut.KEY_F6 -> Printf.printf "F6 pressed.\n%!"
      | Glut.KEY_F7 -> Printf.printf "F7 pressed.\n%!"
      | Glut.KEY_F8 -> Printf.printf "F8 pressed.\n%!"
      | Glut.KEY_F9 -> Printf.printf "F9 pressed.\n%!"
      | Glut.KEY_F10 -> Printf.printf "F10 pressed.\n%!"
      | Glut.KEY_F11 -> Printf.printf "F11 pressed.\n%!"
      | Glut.KEY_F12 -> Printf.printf "F12 pressed.\n%!"
      | Glut.KEY_LEFT -> Printf.printf "Left pressed.\n%!"
      | Glut.KEY_UP -> Printf.printf "Up pressed.\n%!"
      | Glut.KEY_RIGHT -> Printf.printf "Right pressed.\n%!"
      | Glut.KEY_DOWN -> Printf.printf "Down pressed.\n%!"
      | Glut.KEY_PAGE_UP -> Printf.printf "PgUp pressed.\n%!"
      | Glut.KEY_PAGE_DOWN -> Printf.printf "PgDown pressed.\n%!"
      | Glut.KEY_HOME -> Printf.printf "Home pressed.\n%!"
      | Glut.KEY_END -> Printf.printf "End pressed.\n%!"
      | Glut.KEY_INSERT -> Printf.printf "Insert pressed.\n%!"
  with
    | Glut.BadEnum m -> Printf.printf "%s\n" m
;;

let () =
  ignore (Glut.init Sys.argv);
  ignore (Glut.createWindow ~title:"OpenGL Demo");
  GlClear.color (1.0, 1.0, 1.0);
  Glut.keyboardFunc ~cb:(keyboard);
  Glut.specialFunc ~cb:(special);
  Glut.displayFunc ~cb:(fun () -> GlClear.clear [ `color ]; Gl.flush ());
  Glut.mainLoop ()

现在问题就在于此。当numlock关闭时按numlock或任何其他小键盘键会因抛出异常而导致程序崩溃。试图在特殊功能中捕获此异常无济于事。

以下是示例运行。

> ./gl.opt 
Up pressed.
Down pressed.
Key: 1 49 pressed.
Key: 2 50 pressed.
Fatal error: exception Glut.BadEnum("key in special_of_int")

有人可以向我解释为什么它会像这样工作以及如何解决它?

2 个答案:

答案 0 :(得分:4)

根据this代码,编写它的用户似乎只是试图以下列方式规避错误:

let rec handlelablglutbug () =
    try
      Glut.mainLoop ();
    with Glut.BadEnum "key in special_of_int" ->
      showtext '!' " LablGlut bug: special key not recognized";
      Glut.swapBuffers ();
      handlelablglutbug ()
  in
  handlelablglutbug ();

这让我觉得这是一个关于过量库的ocaml端口的错误..所以无法进行无缝修复。

答案 1 :(得分:3)

看起来OpenGL库正在报告OCaml绑定不支持的密钥编号。

如果最新版本的lablGL发生这种情况,您可能希望将此报告为错误, 并建议添加KEY_UNKNOWN of int以处理人们现在发明的密钥(例如“多媒体”密钥)是个好主意。