線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1129
推到 Plurk!
推到 Facebook!

一直出現"Stack overflow"的錯誤,麻煩各位幫我看看。

尚未結案
kikikaka
一般會員


發表:32
回覆:28
積分:12
註冊:2003-09-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-29 17:39:36 IP:220.130.xxx.xxx 未訂閱
各位大大:     小弟的程式,一直會出現"Stack overdlow"的錯誤,麻煩各位高手幫我看 一下,是程式哪裡出錯了,還是哪邊寫法有不對的地方。謝謝各位。    
  DWORD BTime;
  byte **pixel8bit,
       **d,
       **newcolor;      int g, h, sum[638][478], maxvalue=0, minvalue=10000, interval,
      x=0, y=0, i=0, j=0;      Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
  pBitmap->Assign(Image1->Picture->Bitmap);      BTime=timeGetTime();      pixel8bit = new byte*[pBitmap->Height];
  d = new unsigned char*[pBitmap->Height];
    for ( y = 0; y < pBitmap->Height; y  )
    {
      pixel8bit[y] = (Byte *)pBitmap->ScanLine[y];
      d[y] = new unsigned char[pBitmap->Width];
      for ( x = 0; x < pBitmap->Width; x  )
      {
        d[y][x]= pixel8bit[y][x];
      }
    }        for (int y = 1; y < pBitmap->Height-1; y  )
      for (int x = 1; x < pBitmap->Width-1; x  )
      {
          g  = d[y-1][x-1] d[y-1][x] d[y-1][x 1]
                d[y][x-1] d[y][x] d[y][x 1]
                d[y 1][x-1] d[y 1][x] d[y 1][x 1];               h = g/9.0;               for (  j = 0; j < 478; j  )
                for   (  i = 0; i < 638; i  )
                  {
            sum[j][i] = pow(d[y-1][x-1]-h, 2) pow(d[y-1][x]-h, 2)
                        pow(d[y-1][x 1]-h ,2) pow(d[y][x-1]-h, 2)
                        pow(d[y][x]-h, 2) pow(d[y][x 1]-h ,2)
                        pow(d[y 1][x-1]-h, 2) pow(d[y 1][x]-h, 2)
                        pow(d[y 1][x 1]-h, 2);
                   }
                        {
                        if (sum[j][i] > maxvalue)
                        {
                        maxvalue = sum[j][i];
                        }                            if (sum[j][i] < minvalue)
                        {
                        minvalue = sum[j][i];
                        }
                        }
      }         interval = 255/(maxvalue-minvalue);
       for ( j = 0; j < 478; j  )
          for ( i = 0; i < 638; i  )
          {
          newcolor[j][i] = (sum[j][i]-minvalue)*interval;
          newcolor[j][i] = pixel8bit[y][x];
          }      Image1->Picture->Bitmap->Assign(pBitmap);
  Label1->Caption = IntToStr(timeGetTime()-BTime) " msec.";
  Edit1->Text = maxvalue;
  Edit2->Text = minvalue;
  delete pixel8bit;
  delete d;
  delete pBitmap;    
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-29 18:11:21 IP:61.230.xxx.xxx 未訂閱
引言: 各位大大: 小弟的程式,一直會出現"Stack overdlow"的錯誤,麻煩各位高手幫我看 一下,是程式哪裡出錯了,還是哪邊寫法有不對的地方。謝謝各位。
你好: 你的程式compoler就不會過,怎麼出現stack overflow 還有pow()是什麼function? 還有
 interval = 255/(maxvalue-minvalue);
 for ( j = 0; j < 478; j  )
 {
   for ( i = 0; i < 638; i  )
   {
     newcolor[j][i] = (sum[j][i]-minvalue)*interval;
     newcolor[j][i] = pixel8bit[y][x];  //<- x,y What value?
   }
 }  
d是二維指標陣列,只用delete d;一定會錯的 請改成
for ( y = 0; y < pBitmap->Height; y  )
{
   delete d[y];
}
delete d;
kikikaka
一般會員


發表:32
回覆:28
積分:12
註冊:2003-09-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-29 18:34:02 IP:163.13.xxx.xxx 未訂閱
引言: 你好: 你的程式compoler就不會過,怎麼出現stack overflow 還有pow()是什麼function? 還有
 interval = 255/(maxvalue-minvalue);
 for ( j = 0; j < 478; j  )
 {
   for ( i = 0; i < 638; i  )
   {
     newcolor[j][i] = (sum[j][i]-minvalue)*interval;
     newcolor[j][i] = pixel8bit[y][x];  //<- x,y What value?
   }
 }  
d是二維指標陣列,只用delete d;一定會錯的 請改成
for ( y = 0; y < pBitmap->Height; y  )
{
   delete d[y];
}
delete d;
你好: pow(x, y),是傳回x的y次方的值,我是看著書練習的,應該是這樣用吧。
 interval = 255/(maxvalue-minvalue);
 for ( j = 0; j < 478; j  )
 {
   for ( i = 0; i < 638; i  )
   {
     newcolor[j][i] = (sum[j][i]-minvalue)*interval;
     newcolor[j][i] = pixel8bit[y][x]; //我是想把經計算後的新pixel值
                                          傳回到pixel8bit,然後在影
                                          像上表示出來。
   }
 }  
謝謝,我忘了改。
for ( y = 0; y < pBitmap->Height; y  )
{
   delete d[y];
}
delete d;
謝謝Jerry大大,可是我的compiler都可以過,只是執行時一直會有錯誤。
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-30 14:38:17 IP:61.230.xxx.xxx 未訂閱
kikikaka你好:      能否將你的演算法post出來,好讓大家知道程式在做什麼?雖然你是問Stack  overflow ,但是我覺得那只是冰山的一角,因為我看了你的程式,發現很多邏輯都 很奇怪,潛藏的問題還有很多。就你的問題應該是出在這一段吧(我猜的)
 interval = 255/(maxvalue-minvalue);
 for ( j = 0; j < 478; j  )
   for ( i = 0; i < 638; i  )
   {
      newcolor[j][i] = (sum[j][i]-minvalue)*interval;
      newcolor[j][i] = pixel8bit[y][x];
   }
因為maxvalue和minvalue相等時,程式就錯了。理論上,應該很難相等,也不太會 出現堆疊溢位的情況,但是問題就出在這段程式
 if (sum[j][i] > maxvalue)
 {
   maxvalue = sum[j][i];
 }
 if (sum[j][i] < minvalue)
 {
   minvalue = sum[j][i];
 }
j和i永遠都是478 和 638,值永遠也都是0,所以0-0 = 0, 0做為分母問題就出現 。不曉得你為什麼這樣寫,不過這的確是會造成一些問題,且每次都會發生。 其他的問題有很多,都跟標題無關,我幫你修改了一些,程式碼如下,可以執行 結果是跟做sobel差不多。
  DWORD BTime;
  byte *pixel8bit,
       **d;
  byte newclr;      int g, h, x=0, y=0, i=0, j=0;
  double sum[480][640];
  double interval = 0, maxvalue=0, minvalue=10000;      Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
  pBitmap->Assign(Image1->Picture->Bitmap);      BTime=timeGetTime();      d = new unsigned char*[pBitmap->Height];
  for ( y = 0; y < pBitmap->Height; y  )
  {
      pixel8bit = (Byte *)pBitmap->ScanLine[y];
      d[y] = new unsigned char[pBitmap->Width];
     for ( x = 0; x < pBitmap->Width; x  )
     {
        d[y][x]= pixel8bit[x*3];  //<-讀入的圖片為pixelformat 為 24bits的情況下
     }
  }        for (int y = 1; y < pBitmap->Height-1; y  )
      for (int x = 1; x < pBitmap->Width-1; x  )
      {
         g  =  d[y-1][x-1]   d[y-1][x]   d[y-1][x 1]
               d[y][x-1]     d[y][x]     d[y][x 1]
               d[y 1][x-1]   d[y 1][x]   d[y 1][x 1];             h = g/9.0;             sum[y][x] = pow((double)d[y-1][x-1] - h, 2.0) pow((double)d[y-1][x]-h, 2.0)
                     pow((double)d[y-1][x 1] - h, 2.0) pow((double)d[y][x-1]-h, 2.0)
                     pow((double)d[y][x]     - h, 2.0) pow((double)d[y][x 1]-h, 2.0)
                     pow((double)d[y 1][x-1] - h, 2.0) pow((double)d[y 1][x]-h, 2.0)
                     pow((double)d[y 1][x 1] - h, 2.0);             if (sum[y][x] > maxvalue)
         {
             maxvalue = sum[y][x];
         }             if (sum[y][x] < minvalue)
         {
             minvalue = sum[y][x];
         }
     }         if(maxvalue == minvalue)
     {
       interval = 1;
     }
     else
     {
       interval = 255.0/(double)(maxvalue-minvalue);
     }         for ( j = 1; j < 479; j  )
       for ( i = 1; i < 639; i  )
       {
          newclr = (byte)(((int)sum[j][i]-minvalue)*interval);
          pBitmap->Canvas->Pixels[i][j] = (TColor)RGB(newclr,newclr,newclr);
       }      Image1->Picture->Bitmap->Assign(pBitmap);
  Label5->Caption = IntToStr(timeGetTime()-BTime) " msec.";
  Edit1->Text = maxvalue;
  Edit2->Text = minvalue;
  //  delete pixel8bit;
  for ( y = 0; y < pBitmap->Height; y  )
  {
    delete d[y];
  }
  delete d;      delete pBitmap;
系統時間:2024-05-01 0:04:51
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!