2013-03-08 43 views
10

Tôi gặp sự cố lạ với các hàm timeoutgetch từ thư viện ncurses được sử dụng trong Haskell. Khi tôi sử dụng chúng từ GHCi hoặc runhaskell, chúng hoạt động như mong đợi - getch đợi số milisecond được cấp cho timeout và sau đó trả về, ngay cả khi không có đầu vào nào được đưa ra. Nhưng khi tôi biên dịch cùng một tệp bằng GHC, getch sẽ trả về ngay lập tức.Sự khác biệt cho ncurses giữa giải thích và biên dịch Haskell?

Tôi đã thử hai liên kết ncurses cho Haskell; hscurses:

import UI.HSCurses.Curses 

main = do 
    initCurses 
    timeout 1000 
    c <- getch 
    endWin 
    print c 

ncurses:

import UI.NCurses 

main = do 
    e <- runCurses $ do 
    win <- defaultWindow 
    getEvent win $ Just 1000 
    print e 

Cả hai hành xử theo cách kỳ lạ tương tự được mô tả trước đó.

Tôi cũng đã cố gắng chương trình tương đương trong C:

#include <ncurses.h> 

int main() 
{ 
    initscr(); 
    wtimeout(stdscr,1000); 
    int c = getch(); 
    endwin(); 
    printf("%d\n", c); 
    return 0; 
} 

một này hoạt động như mong đợi.

Vì vậy, câu hỏi của tôi là: điều gì có thể tạo sự khác biệt khi sử dụng thiết bị đầu cuối từ diễn giải và từ Haskell đã biên dịch? Do runhaskell và ghci sửa đổi một số thiết lập đầu cuối tinh tế? Hoặc các mã biên dịch tải thư viện một cách khác nhau?

thêm:

tôi đã cố gắng để gọi một chương trình C từ biên soạn Haskell sử dụng FFI và nó trở lại ngay lập tức (đó là không chính xác). Tôi nghĩ điều đó có nghĩa là vấn đề không nằm trong thư viện, nhưng ở đâu đó trong thời gian chạy của GHC.

+0

nếu mã được hiển thị ở trên thực sự hoạt động như mô tả khi được biên dịch, bạn nên gửi báo cáo lỗi cho người bảo trì thư viện. – didierc

+0

Các thư viện Haskell nên làm điều cần thiết giống như chương trình C và chúng hoạt động chính xác khi được giải thích, vì vậy tôi không nghĩ rằng vấn đề là ở đây. –

+0

tốt, nó hoạt động cho tôi hoặc từ repl hoặc với runhaskell. – didierc

Trả lời

1

tôi đã cố gắng mã của bạn - một chút thay đổi với một giá trị thời gian chờ lớn hơn - sử dụng runhaskell, và GHC với các lệnh sau:

$ runhaskell so_15305317.hs 

$ ghc -packages hscurses -lncurses so_15305317.hs 
$ ./a.out 

Trong cả hai trường hợp, tôi đã kết thúc với hành vi mong đợi. Việc cài đặt ghc của bạn phải là bị hỏng hoặc lệnh được sử dụng để biên dịch bao gồm các thông số vi phạm hành vi thư viện.

phiên bản ghc là 6.12.1 và mã hcurses là 1.13.0.2, trên hệ thống debian 6.0.5.

+0

Đã thử với các lệnh giống nhau (chỉ tên gói là 'hscurses'), đã nhận được kết quả sai. GHC của tôi là phiên bản 7.4.1, có thể là lý do. –

+0

ah vâng, cái tên thực sự là hscurses, đó là một lỗi đánh máy trong câu trả lời của tôi. – didierc

+0

vì vậy tôi đoán chúng tôi đã quay lại ý tưởng báo cáo lỗi. – didierc