- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用这段代码,并且会触发stackoverflow,如果我使用Extlib的Hashtbl则不会发生错误。有没有关于在没有 stackoverflow 的情况下使用专门的 Hashtbl 的提示?
module ColorIdxHash = Hashtbl.Make(
struct
type t = Img_types.rgb_t
let equal = (==)
let hash = Hashtbl.hash
end
)
(* .. *)
let (ctable: int ColorIdxHash.t) = ColorIdxHash.create 256 in
for x = 0 to width -1 do
for y = 0 to height -1 do
let c = Img.get img x y in
let rgb = Color.rgb_of_color c in
if not (ColorIdxHash.mem ctable rgb) then ColorIdxHash.add ctable rgb (ColorIdxHash.length ctable)
done
done;
(* .. *)
回溯指向 hashtbl.ml:
Fatal error: exception Stack_overflow Raised at file "hashtbl.ml", line 54, characters 16-40 Called from file "img/write_bmp.ml", line 150, characters 52-108 ...
有什么提示吗?
最佳答案
嗯,您正在使用物理相等 (==) 来比较哈希表中的颜色。如果颜色是结构化值(我无法从这段代码中看出),那么它们在物理上不会彼此相等。如果所有颜色都是不同的对象,它们都会进入表中,这实际上可能是相当大量的对象。另一方面,哈希函数将基于实际的颜色 R、G、B 值,因此很可能存在大量重复项。这意味着您的哈希桶将具有很长的链。也许某些内部函数不是尾递归的,因此会溢出堆栈。
通常最长链的长度为 2 或 3,因此这个错误不经常出现也就不足为奇了。
查看我的 hashtbl.ml (OCaml 3.12.1) 副本,我在第 54 行没有看到任何非尾递归的内容。所以我的猜测可能是错误的。第 54 行为哈希表分配了一个新的内部数组。因此,另一个想法是您的哈希表变得太大(可能是由于不需要的重复项)。
可以尝试的一件事是使用结构相等 (=) 并查看问题是否消失。
关于hashtable - Stackoverflow 与专门的 Hashtbl(通过 Hashtbl.make),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6757509/
我有一个带有模板函数的基类,该函数具有通用模板类型和专用版本。 #ifndef BASE_CLASS #define BASE_CLASS #include using namespace std;
我有这个 3D vector 模板 template class Vec3TYPE{ public: union{ struct{ TYPE x,y,z; }; struct{ TY
我是一名优秀的程序员,十分优秀!