簡體   English   中英

由於大量計算導致堆棧溢出錯誤

[英]Stack overflow error due to large amount of calculations

我只是在尋找以下代碼的有效方法,因為我得到了堆棧溢出錯誤,我給了盡可能多的信息,但也許你不需要所有這些解釋但只是代碼本身就足夠了,任何幫助都會是感謝讓我得到這個錯誤;

我正在嘗試將操作員(Hueckel邊緣檢測操作員)一次應用於9x9區域並對整個圖像重復該操作。 因此它是一種常規的邊緣檢測基礎。 你可以在第二張圖片上看到我的意思。

在此輸入圖像描述在此輸入圖像描述

函數a()在另一個名為hueckel_operator()的函數中被調用8次,而hueckel_operator是一個遞歸函數,每次都為x和y參數調用自身+5。 這意味着a()幾乎被稱為大圖像和真正的問題MyImage [],這是一個emgucv Image <>對象。 因為MyImage []應該檢查9x9矩陣中的每個像素並帶來它的值,所以它被稱為比函數a()多69 * j倍。

函數input_i_y()帶有y坐標,還有另一個叫做input_i_x()的函數,它帶來了9x9矩陣的x坐標。 我知道,為了將它們用作另一個函數的參數,制作兩個單獨的函數是極端的,但我找不到更好的解決方案。 HueckelDisk類根據x,y坐標計算9個不同的hueckel磁盤的公式。 根據擬合精度,我們確定是否存在邊緣。

在此輸入圖像描述

這是hueckel_operator()的終止條件

if (mod_width + counter4 + 10 >= MyImage.Width && mod_height + counter5 + 10 >= MyImage.Height)
            {
                goto EXIT2;
            }

這是hueckel_operator()的開頭和結尾

public void hueckel_operator(int counter2, int counter3)
        {      
            counter2 = counter4;
            counter3 = counter5;

               int mod_width = MyImage.Width % 5;
            int mod_height = MyImage.Height % 5;

            if (mod_width + counter4 + 10 >= MyImage.Width && mod_height + counter5 + 10 >= MyImage.Height)
            {
                goto EXIT2;
            }
            else
            {
                if (mod_width + counter4 + 10 >= MyImage.Width)
                {
                    if (counter5 == 1)
                    {
                        counter5 += 4;
                    }
                    else
                    {
                        counter5 += 5;
                    }
                    counter4 = 1;
                }
                if (counter4 == 1)
                {
                    counter4 += 4;
                }

                else if(counter4 != 0)

                {
                    counter4 += 5;
                }

                if (counter5 == 0 && counter4 == 0)
                {
                    counter4 = 1;
                    counter5 = 1;
                }
            }

這是hueckel_operator()的結尾;

出口:

               hueckel_operator(counter5, counter4);

        EXIT2:

            MessageBox.Show("done");
        }

這是函數a()

 public double a(int j,  int counter6,  int counter7)
                {

                    double result = 0;

                    HueckelDisks hueckel_formula = new HueckelDisks();

                    counter6 = counter4;
                    counter7 = counter5;


                    for (int II = 0; II <= j ; II++)
                    {
                        for (KK = 1; KK < 69; KK++)
                        {

                            result += hueckel_formula.HueckelDisk(input_i_x(KK),input_i_y(KK),j) * MyImage[point_a, point_b].Intensity;

                        }
                    }

                    return result;
                }


         public int input_i_y(int y)
                {        
                    Tuple<int, int>[] myArray =
                    {
                        Tuple.Create(3,1),Tuple.Create(4,1),Tuple.Create(5,1),Tuple.Create(6,1),Tuple.Create(7,1),Tuple.Create(2,2),
                        Tuple.Create(3,2),Tuple.Create(4,2),Tuple.Create(5,2),Tuple.Create(6,2),Tuple.Create(7,2),Tuple.Create(8,2),
                        Tuple.Create(1,3),Tuple.Create(2,3),Tuple.Create(3,3),Tuple.Create(4,3),Tuple.Create(5,3),Tuple.Create(6,3),
                        Tuple.Create(7,3),Tuple.Create(8,3),Tuple.Create(9,3),Tuple.Create(1,4),Tuple.Create(2,4),Tuple.Create(3,4),
                        Tuple.Create(4,4),Tuple.Create(5,4),Tuple.Create(6,4),Tuple.Create(7,4),Tuple.Create(8,4),Tuple.Create(9,4),
                        Tuple.Create(1,5),Tuple.Create(1,5),Tuple.Create(2,5),Tuple.Create(3,5),Tuple.Create(4,5),Tuple.Create(5,5),
                        Tuple.Create(6,5),Tuple.Create(7,5),Tuple.Create(8,5),Tuple.Create(9,5),Tuple.Create(1,6),Tuple.Create(2,6),
                        Tuple.Create(3,6),Tuple.Create(4,6),Tuple.Create(5,6),Tuple.Create(6,6),Tuple.Create(7,6),Tuple.Create(8,6),
                        Tuple.Create(8,6),Tuple.Create(1,7),Tuple.Create(2,7),Tuple.Create(3,7),Tuple.Create(4,7),Tuple.Create(5,7),
                        Tuple.Create(6,7),Tuple.Create(7,7),Tuple.Create(8,7),Tuple.Create(9,7),Tuple.Create(2,8),Tuple.Create(3,8),
                        Tuple.Create(4,8),Tuple.Create(5,8),Tuple.Create(6,8),Tuple.Create(7,8),Tuple.Create(8,8),Tuple.Create(3,9),
                        Tuple.Create(4,9),Tuple.Create(5,9),Tuple.Create(6,9),Tuple.Create(7,9),

                    };


                    return myArray[y].Item2;


                }

請檢查在input_i_y之外創建myArray

它甚至可以是靜態的,因為它不會在兩次調用之間發生變化。

// ...somewhereinside you Hueckel class

public Tuple<int, int>[] myArray { get; set; }

// Initialize it
public void InitializeHueckel()
{
    CreateMyArray();
}

// and build it 
public void  CreateMyArray()
{
   myArray = new Tuple<int, int>[] {
             Tuple.Create(3, 1), Tuple.Create(4, 1), Tuple.Create(5, 1), 
             Tuple.Create(6, 1), Tuple.Create(7, 1), Tuple.Create(2, 2), 
             Tuple.Create(3, 2), Tuple.Create(4, 2), Tuple.Create(5, 2), 
             Tuple.Create(6, 2), Tuple.Create(7, 2), Tuple.Create(8, 2), 
             Tuple.Create(1, 3), Tuple.Create(2, 3), Tuple.Create(3, 3), 
             Tuple.Create(4, 3), Tuple.Create(5, 3), Tuple.Create(6, 3), 
             Tuple.Create(7, 3), Tuple.Create(8, 3), Tuple.Create(9, 3), 
             Tuple.Create(1, 4), Tuple.Create(2, 4), Tuple.Create(3, 4), 
             Tuple.Create(4, 4), Tuple.Create(5, 4), Tuple.Create(6, 4), 
             Tuple.Create(7, 4), Tuple.Create(8, 4), Tuple.Create(9, 4), 
             Tuple.Create(1, 5), Tuple.Create(1, 5), Tuple.Create(2, 5), 
             Tuple.Create(3, 5), Tuple.Create(4, 5), Tuple.Create(5, 5), 
             Tuple.Create(6, 5), Tuple.Create(7, 5), Tuple.Create(8, 5), 
             Tuple.Create(9, 5), Tuple.Create(1, 6), Tuple.Create(2, 6), 
             Tuple.Create(3, 6), Tuple.Create(4, 6), Tuple.Create(5, 6), 
             Tuple.Create(6, 6), Tuple.Create(7, 6), Tuple.Create(8, 6), 
             Tuple.Create(8, 6), Tuple.Create(1, 7), Tuple.Create(2, 7), 
             Tuple.Create(3, 7), Tuple.Create(4, 7), Tuple.Create(5, 7), 
             Tuple.Create(6, 7), Tuple.Create(7, 7), Tuple.Create(8, 7), 
             Tuple.Create(9, 7), Tuple.Create(2, 8), Tuple.Create(3, 8), 
             Tuple.Create(4, 8), Tuple.Create(5, 8), Tuple.Create(6, 8), 
             Tuple.Create(7, 8), Tuple.Create(8, 8), Tuple.Create(3, 9), 
             Tuple.Create(4, 9), Tuple.Create(5, 9), Tuple.Create(6, 9), 
             Tuple.Create(7, 9), 
             };

在input_i_y中,您可以像以前一樣使用它:

return myArray[y].Item2;

應該刪除一些堆棧的負載。

hueckel_operator方法的最開始包含一個可能的無限遞歸源的提示。

public void hueckel_operator(int counter2, int counter3)
        {      
            counter2 = counter4;
            counter3 = counter5;

您不是使用兩個參數的值,而是立即為它們分配必須來自我們在您發布的代碼中看不到的字段的值。

其余的可見代碼甚至沒有引用這些參數。

不可能肯定地說出錯誤被賦予了你發布的代碼位,但很可能真正驅動邏輯的這些字段值沒有改變,或者沒有以遞歸結束的方式改變。

我希望根本問題是你無法理解自己的代碼。 您應該使用有意義的變量名而不是counter2counter3等,嘗試以與參數不同的方式命名字段,避免重新分配參數,並僅定義實際使用的參數。

而且我也試圖擺脫goto

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM