2012-07-08 34 views
4

我只是尋找一個有效的方式,因爲我得到一個堆棧溢出錯誤,我給了儘可能多的信息,但也許你不需要所有這些解釋只是本身就足夠的代碼,任何幫助,將不勝感激,讓我得到這個錯誤的乘駕;堆棧溢出錯誤,由於大量的計算

我所試圖做的同時將操作員(Hueckel邊緣檢測算)到9x9的區域,並重復整個圖像。所以它是一個常規的邊緣檢測基礎。你可以在第二張照片上看到我的意思。

enter image description hereenter image description here

函數A()是在一個時間被調用另一個函數稱爲hueckel_operator()的8倍和hueckel_operator是遞歸函數,其調用自身5爲x和y參數每一次。這意味着一個()被調用幾乎爲大圖像和真正的問題MYIMAGE []這是一個emgucv圖像<>對象。因爲MYIMAGE []應該檢查在9×9矩陣的每個像素,並把它的值,它被稱爲比函數69 *進行j次以上的()。

函數input_i_y()帶有y座標,還有另一個函數叫做input_i_x(),它帶來了9x9矩陣的x座標。我知道,這是極端的,使兩個不同的功能,以將它們作爲另一個函數的參數,但我找不到任何更好的解決方案。 HueckelDisk類計算根據X的9個不同的hueckel磁盤式中,y座標。根據擬合精度,我們可以確定是否存在邊緣。

enter image description here

這裏是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();

EXIT:

   hueckel_operator(counter5, counter4); 

     EXIT2: 

      MessageBox.Show("done"); 
     } 

這裏是函數()

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; 


       } 
+1

堆棧溢出來自遞歸。您發佈的代碼不包含任何內容。所以我們可能需要看到不同的代碼。 – 2012-07-08 14:30:53

+0

堆棧溢出通常與無限遞歸相關聯(即,一個函數在沒有導致遞歸終止的「基本情況」的情況下不斷調用自身)。所以我會先檢查你的代碼是否正確。當代碼正確但計算仍然會導致堆棧溢出時,通常意味着您提出的算法效率低下,無法在合理的時間內完成。最後,你的函數'input_i_y'在你每次調用它時創建並初始化一個新的數組。這並不能解釋堆棧溢出,但它會很慢。 – arx 2012-07-08 14:32:58

+0

@arx我正在編輯我的問題,你可以看到它是否有界限,但是它被阻塞並且在x = 70,y = 1時拋出堆棧溢出600x800 – mctuna 2012-07-08 14:36:57

回答

2

請檢查在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; 

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

+0

我已經做到了,正如你所說,它減少了負載謝謝。 – mctuna 2012-07-08 16:43:21

+0

歡迎您! – 2012-07-08 16:47:54

+0

@mrtcn如果這解決了你的問題,接受 – 2012-07-09 00:57:37

1

hueckel_operator方法的最開始包含您的無限遞歸的可能來源的暗示。你的兩個參數的

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

就是你,而不是使用值,立即分配他們價值觀必須來自我們不能在發佈代碼中看到的字段。

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

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

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

我試圖擺脫goto以及。

+0

是的,我真的不知道爲什麼,但我發現這樣的解決方案來解決之前的錯誤,但我修復了那些凌亂的參數。但它再次引發堆棧溢出,但是這次在mod_width = MyImage.Width%5; 順便說一句hueckel_operator()被稱爲134次,而a()被稱爲1197次。奇怪的是,它完成了圖像的第一行(x = 75和y = 5),我得到所有必要的值,但是在第二行的1/10處,它引發了堆棧溢出異常。我想這意味着它甚至不能達到終止條件。 – mctuna 2012-07-08 16:55:05

+0

因爲終止條件是x = 590和y = 790。我非常肯定,它甚至不能達到終止條件,因爲hueckel_operator只被調用了134次,而且完成整個圖像的次數卻少得多。 hueckel_operator必須被調用(600/9)*(800/9)次。 – mctuna 2012-07-08 16:56:38