2012-06-04 162 views
3

下面是一些在ideone處執行邊界檢查的代碼。unsafeRead導致堆棧溢出

它成功運行,沒有超出界限的錯誤。

this代碼,在線34我已經在readArray更改爲unsafeRead,它仍然編譯,但崩潰堆棧溢出。

這是一個GHC錯誤還是我做錯了什麼?

回答

7

unsafeRead使用0爲基礎的指數,所以你必須要麼調整用於讀取的索引,

elem <- unsafeRead arr (i-1) 

,或者更好地,具有0

arr <- newArray (0,upperbound) maxBound 

作爲至少索引分配陣列是,unsafeRead從數組中的錯誤位置讀取。

無關:我懷疑ideone使用32位GHC,所以最好不要在那裏運行代碼upperbound > 100000

+0

還要注意''unsafeRead'需要一個Int,而'readArray'需要一個'Ix',這應該是一個小技巧...... – sclv