2015-09-09 4 views
1

Недавно я начал изучать OCaml. Я нашел странную вещь как результат выполнения программы. Пример - часть консольной игры TicTacToe. Этот код:Странный порядок выполнения кода в OCaml

let move pl arr = 
    let() = Printf.printf "Player %i, enter two numbers: \n" pl in 
    let x1 = Scanf.scanf "%i\n" (fun n -> n) in 
    let y1 = Scanf.scanf "%i\n" (fun n -> n) in 
    if (pl=1) then Array.set arr.(x1) y1 "X" 
      else Array.set arr.(x1) y1 "O" 
    ;; 

Дайте такой странный результат:

[email protected]:/home/kirill/workspace/Test2# corebuild hw.native 
Finished, 4 targets (0 cached) in 00:00:00. 
[email protected]:/home/kirill/workspace/Test2# ./hw.native 
1 
1 
Player 1, enter two numbers: 
[email protected]:/home/kirill/workspace/Test2# 

Почему этот код:

let x1 = Scanf.scanf "%i\n" (fun n -> n) in 
let y1 = Scanf.scanf "%i\n" (fun n -> n) in 

запустить перед этим кодом:

let() = Printf.printf "Player %i, enter two numbers: \n" pl in 

???

Извините за плохой английский. Спасибо за ответ!

+4

Это не код, который выполняется из строя, только принтер, который не сделал промойте его. Попробуйте добавить '%!' В конце строки (или вызывать 'flush stdout'), она должна выводиться как ожидалось. Возможный дубликат http://stackoverflow.com/questions/31216473 – anol

+0

Возможный дубликат [вызовов функции OCaml происходит в неправильном порядке] (http://stackoverflow.com/questions/31216473/ocaml-function-calls-happening-in- неправильный порядок) – anol

ответ

2

Во всех языках буферизованные библиотеки ввода-вывода вместо вывода непосредственно в устройство будут выводиться сначала в промежуточный буфер. Они будут очищать данные, как только буфер будет заполнен или переполнен. Они также будут очищать данные при выходе из вашей программы. Здесь данные не сбрасываются (и, следовательно, не печатаются), пока программа не будет завершена. Вы можете использовать flush или flush_all функцию, или использовать OCaml специфичный PRINTF спецификатор %!, чтобы очистить данные в определенных точках программ, например,

Printf.printf "Player %i, enter two numbers: \n%!" 
Смежные вопросы