Необходимо исправить очень большую программу ocaml из чужого источника. Одна из проблем заключается в том, что программа вылетает на, казалось бы, невинной строке:
Hashtbl.mem loc_to_no loc
с исключением «Недостаточно памяти». Дело в том, что памяти там наверняка достаточно и эта строка нормально выполняется для других входов и даже раньше при обработке проблемного.
Запустив его с 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 ;
}
Что нужно сделать, чтобы код выполнялся?