需要修复来自外星人来源的非常庞大的ocaml程序。其中一个问题是程序在看似无辜的行中崩溃了:
Hashtbl.mem loc_to_no loc
带有“Out of memory”异常。问题是那里肯定有足够的内存,这条线对于其他输入执行得很好,甚至在处理问题时也更早。
使用OCAMLRUNPARAM="v=63"
运行它后,我看到在崩溃之前打印的一行:
结构比较中的堆栈溢出
所涉及的结构定义如下。 loc
的类型为location
。
type ('a, 'b, 'c) automaton = {
aut_id : int ;
mutable start_location : (('a, 'b, 'c) location) option ;
mutable end_location : (('a, 'b, 'c) location) option ;
mutable aut_attributes : 'a ;
}
and ('a, 'b, 'c) location = {
loc_id : int ;
mutable succs : ('c * ('a, 'b, 'c) location) list ;
mutable preds : ('c * ('a, 'b, 'c) location) list ;
automaton : ('a, 'b, 'c) automaton ;
mutable loc_attributes : 'b ;
}
如何使代码执行?
答案 0 :(得分:6)
好吧,哈希表查找使用“=
”(结构相等)来确定密钥是否与您要查找的密钥相同。结构平等需要深入检查所有子结构和东西。您有一个复杂的递归数据结构。也许在某个时刻结构中存在一个循环,这会导致它无限循环。在任何情况下,考虑一下你希望哈希表如何判断一个键是否与你的相同,然后你需要使用那种相等而不是默认的结构相等;使用Hashtbl.Make
仿函数定义具有自定义相等和/或哈希函数的哈希表模块。