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

區域成長造成stack overflow

答題得分者是:暗黑破壞神
kobebryant81
一般會員


發表:15
回覆:15
積分:6
註冊:2007-05-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-05-28 16:49:19 IP:140.135.xxx.xxx 訂閱
想請問各位,我已經把stack size調到最大了,但處理的影像太大還是會有stack overflow的問題出現,版上有大大說盡量不要一直call function,但如果我一定要用區域成長的方式下,還有辦法解救嗎??,我用區域成長主要就是將一張影像圈出一個ROI並將這個ROI擷取下來<textarea class="cpp" rows="10" cols="60" name="code"> 請在此區域輸入程式碼 </textarea>
<textarea class="cpp" rows="10" cols="60" name="code">void region_grow(int i,int j,Byte *data,Graphics::TBitmap *tempimage)//i,j是影像上的位置,Byte *data是一個動態宣告的陣列,主要是用來標記我所找過的點,Graphics::TBitmap *tempimage是我所圈選的那張影像 { if(i<0||i>tempimage->Width||j<0||j>tempimage->Height) return; if(data[j*tempimage->Width i]==255) return; //255表示這個點已經找過了,而且是我要的點 if(tempimage->Canvas->Pixels[i][j]==clLime)return;//如果是綠色的線代表碰到圈選的邊界了 if(tempimage->Canvas->Pixels[i][j]!=clLime)//此點還沒標示 data[j*tempimage->Width i]=255; region_grow(i,j-1,data,tempimage); region_grow(i 1,j,data,tempimage); region_grow(i,j 1,data,tempimage); region_grow(i-1,j,data,tempimage); }</textarea>
編輯記錄
kobebryant81 重新編輯於 2007-05-28 16:50:37, 註解 無‧
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-05-28 17:26:02 IP:218.170.xxx.xxx 未訂閱
你要玩遞迴?
那理論上可行。
實際上,你得去算它最大會跑幾圈。
然後每一圈要多少記憶體。。。。。ETC
如果我是你,遇到這個情況,我也許會採用一個公用變數來放大家相同的東西。
把變動縮小。縮小後才變成參數下去傳。
不然你就會遇到這樣的 stack overflow 的問題。

===================引 用 kobebryant81 文 章===================
想請問各位,我已經把stack size調到最大了,但處理的影像太大還是會有stack overflow的問題出現,版上有大大說盡量不要一直call function,但如果我一定要用區域成長的方式下,還有辦法解救嗎??,我用區域成長主要就是將一張影像圈出一個ROI並將這個ROI擷取下來
kobebryant81
一般會員


發表:15
回覆:15
積分:6
註冊:2007-05-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-05-28 17:42:37 IP:140.135.xxx.xxx 訂閱

===================引 用 暗黑破壞神 文 章===================
你要玩遞迴?
那理論上可行。
實際上,你得去算它最大會跑幾圈。
然後每一圈要多少記憶體。。。。。ETC
如果我是你,遇到這個情況,我也許會採用一個公用變數來放大家相同的東西。
把變動縮小。縮小後才變成參數下去傳。
不然你就會遇到這樣的 stack overflow 的問題。

暗黑板主~我不太懂你的意思耶~採用大家相同的東西@@
能在稍微講細一點嗎??意思說function變數太多了嗎??
感謝解答!
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-05-28 17:49:50 IP:218.170.xxx.xxx 未訂閱
function( char * pdata)
{
char data[10000];
function(data);
}
這種做法每呼叫一次就會佔 10000 byte (最少。我沒算其它的部份。光就 stack 在 data 的配置上。)

換成
char data[10000]
function(int position)
{
function(position);
}
這樣,你把 data 拉到外面去。只是傳說我要處理那一行。這樣每次呼叫,只是用了一個 int 的空間。

用類似這種做法來解決你的問題。
kobebryant81
一般會員


發表:15
回覆:15
積分:6
註冊:2007-05-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-05-28 21:20:47 IP:140.135.xxx.xxx 訂閱

===================引 用 暗黑破壞神 文 章===================
function( char * pdata)
{
?? char data[10000];
??? function(data);
}
這種做法每呼叫一次就會佔 10000 byte (最少。我沒算其它的部份。光就 stack 在 data 的配置上。)

換成
char data[10000]
function(int position)
{
function(position);
}
這樣,你把 data 拉到外面去。只是傳說我要處理那一行。這樣每次呼叫,只是用了一個 int 的空間。

用類似這種做法來解決你的問題。


酷!!把一些多餘的寫到外面去就可以了~~
我能再問個問題嗎??就是之前版主你有說到去計算每一次call涵式時用多少記憶體~請問這個計算是要如何得知
因為聽到可以得知用掉多少記憶體~蠻好奇的~想知道~但我打記憶體關鍵字都沒找到我要的答案~謝謝
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-05-28 22:03:37 IP:218.170.xxx.xxx 未訂閱
這樣有解決你的問題了嗎?

至於怎麼記算,基本上,我們要看到C怎麼去看待記憶體
以及變數的生命週期這一堆事情。
這說起來很長。自己要看書。
不過大致上的計算方式
function call 中有用到的,除了你有宣告 static 之外的變數。都會是佔用 stack
而 alloc 來的,是佔用 stack 了。

http://blog.chinaunix.net/u/26828/showart_292662.html

這邊有說明,你可以看一下。
應該就清楚為什麼我會跟你說要這樣處理了。

===================引 用 kobebryant81 文 章===================
酷!!把一些多餘的寫到外面去就可以了~~
我能再問個問題嗎??就是之前版主你有說到去計算每一次call涵式時用多少記憶體~請問這個計算是要如何得知
因為聽到可以得知用掉多少記憶體~蠻好奇的~想知道~但我打記憶體關鍵字都沒找到我要的答案~謝謝
kobebryant81
一般會員


發表:15
回覆:15
積分:6
註冊:2007-05-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-05-28 22:34:20 IP:220.138.xxx.xxx 訂閱
感謝暗黑板主,我會再研究看看的,至於我的問題已經解決了~謝謝^^
===================引 用 暗黑破壞神 文 章===================
這樣有解決你的問題了嗎?

至於怎麼記算,基本上,我們要看到C怎麼去看待記憶體
以及變數的生命週期這一堆事情。
這說起來很長。自己要看書。
不過大致上的計算方式
function call 中有用到的,除了你有宣告 static 之外的變數。都會是佔用 stack
而 alloc 來的,是佔用 stack 了。

http://blog.chinaunix.net/u/26828/showart_292662.html

這邊有說明,你可以看一下。
應該就清楚為什麼我會跟你說要這樣處理了。

編輯記錄
kobebryant81 重新編輯於 2007-05-28 22:34:54, 註解 無‧
系統時間:2024-04-28 8:04:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!