Переменная объявлена, но не отображается во время отладки C # - PullRequest
0 голосов
/ 29 декабря 2010

снимок экрана отладки: http://img1.uploadscreenshot.com/images/orig/12/36121481470-orig.jpg

обратите внимание, как x, y имеют значения (я не знаю, почему x и y остановились на 69 в цикле for - x должен был подняться до 86 и yдо 183) все же г не имеет никакого значения вообще.(переменная не существует? что?) Как это исправить?

код, если вы хотите прочитать:

        public float[] cht(int[,] matrix)
    {
        float[] xyrd = new float[4];
        int xthreshold, ythreshold;
        float slope;
        double dir;
        float zone;
        int[] limitsStorage = new int[3] { matrix.GetLength(0), matrix.GetLength(1), matrix.GetLength(0) / 2 - 10 };
        short[,,] accumulator = new short[limitsStorage[0]+1, limitsStorage[1]+1,limitsStorage[2]+1];
        for (int x = 0; x < limitsStorage[0]; x++)
        { //first dimension loop of matrix 100
            for (int y = 0; y < limitsStorage[1]; y++)
            { //second dimension loop of matrix 120
                if (matrix[x, y] == 225)
                {//the data at the for loop location is a 1 and not 0 hit.
                    xthreshold = x - limitsStorage[0] / 2;
                    ythreshold = y - limitsStorage[1] / 2;
                    //forget angle, search slope: float angle = xthreshold > 0 ? ((float)Math.Atan2(xthreshold, ythreshold)) : ((float)Math.Atan2(xthreshold, ythreshold) + 180);
                    slope = xthreshold / ythreshold;
                    //initiate if loops.
                    dir = 180 + Math.Round(Math.Atan2(ythreshold, xthreshold) * 57.2957 / 45, 0) * 45 + 45 * (Math.Round(((Math.Atan2(ythreshold, xthreshold) * 57.2957) % 45) / 45));
                    if (slope > .404 || slope < -.404)
                    {
                        if (slope < 2.3558 || slope > -2.3558)
                        {
                            if (xthreshold > 0)
                            {
                                if (ythreshold > 0)
                                {
                                    //+x+y zone
                                    zone = 45 + 180;
                                }
                                else
                                {
                                    //+x-y zone
                                    zone = 180 - 45;
                                }
                            }
                            else
                            {
                                if (ythreshold > 0)
                                {
                                    //-x+y zone
                                    zone = 360 - 45;
                                }
                                else
                                {
                                    //-x-y zone
                                    zone = 45;
                                }
                            }
                        }
                        else if (ythreshold > 0)
                        {
                            //+y zone
                            zone = 360 - 90;
                        }
                        else
                        {
                            //-y zone
                            zone = 90;
                        }
                    }
                    else if (xthreshold > 0)
                    {
                        //+x zone
                        zone = 180;
                    }
                    else
                    {
                        //-x zone
                        zone = 0;
                    }
                    for (int R = 6; R < limitsStorage[2]; R++)
                    { //Radius loop for scan 44
                        float delta = (float)((1 / R) * 57.2957);
                        for (float Theta = zone - 25; Theta < zone + 25; Theta += delta)
                        {
                            accumulator[(int)(((R * Math.Cos(Theta / 57.2957)) < 0 || (R * Math.Cos(Theta / 57.2957)) > limitsStorage[0]) ? 0 : R * Math.Cos(Theta / 57.2957)), (int)(((R * Math.Sin(Theta / 57.2957)) < 0 || (R * Math.Sin(Theta / 57.2957)) > limitsStorage[1]) ? 0 : R * Math.Sin(Theta / 57.2957)),R]++;
                            //btw, 0,0,R is always the non-center area.
                        }
                    }

                }
            }
        }

        for (int x = 1; x < limitsStorage[0]; x++)
        {
            for (int y = 1; y < limitsStorage[1]; y++)
            {
                for (int r = 6; r < limitsStorage[2]; r++)
                {
                    if (xyrd[3] > accumulator[x, y, r])
                    {
                        xyrd[0] = x;
                        xyrd[1] = y;
                        xyrd[2] = r;
                        xyrd[3] = accumulator[x, y, r];
                    }
                }
            }
        }

        if (accPrint)
        {
            //do something for debugging?
            accPrint = false;
        }
        return xyrd;
    }

Ответы [ 3 ]

2 голосов
/ 29 декабря 2010

Я только что заметил, что x и y имеют маленький символ блокировки под ними, указывающий, что у вас есть закрытые переменные с именами x и y в классе, в котором выполняется этот метод. Это x и y, которые вы видите в отладчике.

r надлежащим образом выходит из области видимости после выхода из цикла, в котором он объявлен.

Кстати, x и y являются смехотворно неверными именами переменных-членов и смехотворно неверными именами для for переменных цикла типа int, особенно если они содержатся в классе с именами переменных-членов x и y.

1 голос
/ 29 декабря 2010

Единственное место, которое вы объявляете r, это оператор for, верно?Это означает, что r выходит из области видимости, как только цикл заканчивается.Поэтому, естественно, если вы проверяете переменные в конце функции, r там не будет.

Признаюсь, я не знаю, почему x и y находятся в области видимости, основываясь на комментариях.Они могут быть переменными класса, но спрашивающий говорит, что нет.Это единственное объяснение, которое я могу придумать.

0 голосов
/ 29 декабря 2010

Поведение не странное - вы на самом деле получаете именно то, что ожидаете.

Обратите внимание, что окно просмотра может точно показывать только значения, которые в области действия в точке останова.

В выделенной точке останова в области видимости находится только аккумулятор [x, y, r], и вы видите именно те значения, которые ожидали.

...