5

エイリアンソースからの非常に巨大なocamlプログラムを修正する必要があります。問題の1つは、プログラムが一見無害な行でクラッシュすることです。

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 ;
}

コードを実行するにはどうすればよいですか?

4

1 に答える 1

7

さて、ハッシュテーブルルックアップは " ="(構造的同等性)を使用して、キーが探しているものと同じであるかどうかを判断します。構造の平等には、すべての下部構造などを詳細にチェックする必要があります。複雑な再帰データ構造があります。おそらく、ある時点で構造にサイクルがあり、それによって構造が無限にループします。いずれにせよ、キーが自分のものと同じであるかどうかをハッシュテーブルにどのように伝えたいかを考えてから、デフォルトの構造的同等性の代わりにその種類の同等性を使用する必要があります。ファンクターを使用Hashtbl.Makeして、カスタム等式および/またはハッシュ関数を持つハッシュテーブルモジュールを定義します。

于 2009-09-08T11:21:47.257 に答える