4D: Not enough stack space

Not enough stack space

これまで幾度か遭遇してきたメッセージ。コンパイル時やビルド時では発生せず、実行時に発生する。
前回はNew processコマンドに与える引数によって解決。メソッドをたくさん呼び出している治郎吉商店のコーディングスタイルのプロジェクトでは、スタックメモリのサイズが小さすぎると、このメッセージが表示されることがあった。それを

$main_proc:=New process(“A00_main”;0;”A00_main”;*)

のように4Dにサイズを任せることによって回避できる。ことは承知している。今回はそれが原因ではない。ネットで調べてみると、4D社のナレッジベースにTipsがあった。

スタックに空きがありません

スタックメモリはメソッド呼び出しで消費されるので、再帰が循環すると無限に消費していきやがて枯渇する。再帰メソッドにトレースログを入れてみると、同じキーについて繰り返し実行されている... 循環参照を発見。これがエラーの原因だった。

会計ジロウには、レポート機能があり、科目を集計してそれをいくつかまとめて小計、それをまとめて中計、のような機能がある。スペースにキーと親キーを持たせておいて、親の親の親のような構造を再帰呼び出しで遡って、金額がどこのスペースに集計されなくてはならないかを制御用のテーブルのデータで定義している。
この実装では、データの作り方によっては循環参照になってしまい、再帰呼び出しが完了しなくなる恐れがあった。それはわかっていたのに、自分でそういうデータを作ってしまった。