2

そのため、ユーザーがセットに追加する整数を「ヒープ化」することになっているプログラムに取り組んでいます。ただし、関数にパラメーターとして渡されたノードの左の子ノードにアクセスしようとすると、現在問題が発生しています。Visual Works のメモリが不足しています...

奇妙なことに、デバッガーでは、渡されたノードの Left 子ノードが作成され、渡されたノードに正しく割り当てられていることがわかります。しかし、ソース コードからアクセスしようとすると、クレイジーなメモリ エラーが発生します。

これが対応するコードです。うまくいけば、それは読みやすいです

呼び出されたときにエラーが発生した関数:

addLeftChildTo: aNode

"Determine Left child of passed node. Set that child's parent node as self. Imprint the index where that value was retrieved from the array."

| temp leftChildIndex |
2 * aNode indexOfNode <= arrayOfInput size
    ifTrue: 
        [leftChildIndex := 2 * aNode indexOfNode.
        aNode left: (arrayOfInput at: leftChildIndex).
        aNode left parentNode: aNode.                   <---VW Runs out of memory and crashes here. This occurs once the debugger dives into the 'left' accessor method of the passed aNode object.
        aNode left indexOfNode: leftChildIndex.
        self bubbleUp: aNode left.
        self bubbleUpArrayOfInput: aNode left]
    ifFalse: [aNode left: nil]

BinaryHeapNode クラスの 'left' のアクセサー メソッドは次のとおりです。

left

    ^self left

left: aValue

    left := BinaryHeapNode new: aValue.

また、addLeftChildTo: メソッドを最初に呼び出すコードを参照すると役立つ場合があります...

populateHeap
"from passed array of input"
"Add a node (typically a node with an element from the ArrayOfInput) to the heap. Bubble up as you go."

| temp |
rootNode isNil
    ifTrue: 
        [rootNode := BinaryHeapNode new: (arrayOfInput at: 1).
        rootNode indexOfNode: indexOfArray.

        self addLeftChildTo: rootNode.   <--- Call to function with problematic code. 
                    ...

私は何が間違っているのか理解できず、この問題で数時間立ち往生しています。何か案は?

4

1 に答える 1

5

アクセサー #left で無限再帰を行いました:

left
  ^self left

このメソッドは実際に自分自身を呼び出します。代わりにインスタンス変数のみを返します^left

于 2012-10-30T20:04:46.867 に答える