0

Cadence の Encounter Digital Implementation Shell をソースとするスクリプトを TCL で作成しています。多数の TCL proc を再帰的に実行し、突然、「ネストされた評価が多すぎます (無限ループ?)」と言ってコードを終了します。エラーが発生した proc を見つけ、引数として渡される変数を確認しました。すべての値は正常です。

エラーが出ているprocの部分を添付しています。(スクリプト全体は 1000 行以上なので、この部分だけを言及します)。

for {set i 1} {$i<=[llength $xcoord_sinks_for_clone($clone_to_regroup_ref)]} {incr i} {
        set abs_dist_list($i) ""
        set count 0

        foreach clone $new_clone_index_ref2 {
            set dist($i) [expr [distance [lindex $xcoord_sinks_for_clone($clone_to_regroup_ref) [expr $i-1]] [lindex $xcoord_clones [expr $clone_to_regroup_ref-1]] [lindex $ycoord_sinks_for_clone($clone_to_regroup_ref) [expr $i-1]] [lindex $ycoord_clones [expr $clone_to_regroup_ref-1]]]-[distance [lindex $xcoord_sinks_for_clone($clone_to_regroup_ref) [expr $i-1]] [lindex $xcoord_clones [expr $clone-1]] [lindex $ycoord_sinks_for_clone($clone_to_regroup_ref) [expr $i-1]] [lindex $ycoord_clones [expr $clone-1]]]]
            set dist_abs($i) [expr abs($dist($i))]
            lappend abs_dist_list($i) $dist_abs($i)
            incr count
        }
        set sorted_dist_abs($i) [lsort -real $abs_dist_list($i)]
        lappend min_dist [lindex $sorted_dist_abs($i) 0]
    }

エラー箇所を特定できました。foreach ループ内の 'set dist($i).....' 割り当ての直前まで、スクリプトに従ってすべてが行われます。

メモリ割り当ての問題はありますか? (スクリプトは負荷共有機能で実行されています)

私を助けてください!!

4

2 に答える 2

0

再帰に関するエラーが発生した場合は、関数が自分自身を呼び出していることを意味します。投稿したコードがdistanceproc の一部であり、コードがdistanceそれ自体を呼び出している場合、それが問題である可能性があります。

于 2013-12-04T18:04:55.557 に答える
-1

再帰制限を増やしてみることができます。たとえば、次のようになります。

set old_limit [interp recursionlimit {}]
set limit_increment 2000
interp recursionlimit {} [expr {$old_limit + $limit_increment}]

# execute recursive procedure

interp recursionlimit {} $old_limit
于 2013-12-02T15:31:12.953 に答える