一直出現"Stack overflow"的錯誤,麻煩各位幫我看看。 |
尚未結案
|
kikikaka
一般會員 發表:32 回覆:28 積分:12 註冊:2003-09-26 發送簡訊給我 |
各位大大:
小弟的程式,一直會出現"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 發送簡訊給我 |
引言: 各位大大: 小弟的程式,一直會出現"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 發送簡訊給我 |
引言: 你好: 你的程式compoler就不會過,怎麼出現stack overflow 還有pow()是什麼function? 還有你好: 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]; //<- x,y What value? } }d是二維指標陣列,只用delete d;一定會錯的 請改成for ( y = 0; y < pBitmap->Height; y ) { delete d[y]; } delete d; 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 發送簡訊給我 |
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; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |