队列和While循环内存异常

时间:2014-10-28 18:25:59

标签: c# unity3d queue

我似乎无法理解为什么会抛出内存异常。排队“安全”邻居单元时,我得到一个内存异常。任何想法是什么以及会导致什么?

for (int x = 0; x < 10; x++) {
    for (int y = 0; y < 10; y++) {

        if( chunk.tiles[x,y] != 0 || visited[x,y] != 1 ){ //air or already visited

            _currentIsland = new byte[ 10, 10 ];

            Queue<Vector2> toCheck = new Queue<Vector2>();
            toCheck.Enqueue( new Vector2(x,y) );

            while( toCheck.Count > 0 )
            {
                Vector2 curr = toCheck.Dequeue();

                int[] rowNbr = {-1, -1, -1,  0,  0,  1, 1, 1};
                int[] colNbr = {-1,  0,  1, -1,  1, -1, 0, 1};

                // Mark this cell as visited
                _currentIsland[x,y] = 1;
                visited[x,y] = 1;

                // Recur for all connected neighbours
                for (int k = 0; k < 8; ++k)
                {
                    if ( isSafe ((int)curr.x + rowNbr [k], (int)curr.y + colNbr [k], visited ))
                        {
                            Vector2 n = new Vector2( curr.x  + rowNbr[k], curr.y + colNbr[k] );
                            toCheck.Enqueue(n);
                        }
                    }
                }

                if( _currentIsland.Length > 0 )
                    islands.Add( _currentIsland );

            }
        }
    }

    bool isSafe( int x, int y, byte[,] visited )
    {
        return (InScope (x, y) && visited [x, y] == 0 && chunk.tiles[x,y] > 0 );
    }

谢谢,C。

1 个答案:

答案 0 :(得分:0)

我认为这里的问题是你没有跟踪你在队列中看到的邻居。

所以从(0,0)处开始,可以将以下向量添加到队列中

(1,0),(0,1)和(1,1)

现在对于(1,1)它将查看(0,0),但是isSafe将返回false,因为您将vistied [0,0]设置为1.但它也会添加(1,0) )和(0,1)没有访问设置为1然后将每次添加(1,1)等等。基本上你需要跟踪你见过的哪个嘶嘶声。我猜您需要更改以下行

visited[x,y] = 1;

vistited[curr.x,curr.y] = 1;

但我并不完全确定您的代码的意图,但这就是为什么内存不足会将相同的矢量值一遍又一遍地放在队列中。

相关问题