區域成長造成stack overflow |
答題得分者是:暗黑破壞神
|
kobebryant81
一般會員 發表:15 回覆:15 積分:6 註冊:2007-05-08 發送簡訊給我 |
想請問各位,我已經把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 發送簡訊給我 |
你要玩遞迴?
那理論上可行。 實際上,你得去算它最大會跑幾圈。 然後每一圈要多少記憶體。。。。。ETC 如果我是你,遇到這個情況,我也許會採用一個公用變數來放大家相同的東西。 把變動縮小。縮小後才變成參數下去傳。 不然你就會遇到這樣的 stack overflow 的問題。 ===================引 用 kobebryant81 文 章=================== 想請問各位,我已經把stack size調到最大了,但處理的影像太大還是會有stack overflow的問題出現,版上有大大說盡量不要一直call function,但如果我一定要用區域成長的方式下,還有辦法解救嗎??,我用區域成長主要就是將一張影像圈出一個ROI並將這個ROI擷取下來 |
kobebryant81
一般會員 發表:15 回覆:15 積分:6 註冊:2007-05-08 發送簡訊給我 |
===================引 用 暗黑破壞神 文 章=================== 你要玩遞迴? 那理論上可行。 實際上,你得去算它最大會跑幾圈。 然後每一圈要多少記憶體。。。。。ETC 如果我是你,遇到這個情況,我也許會採用一個公用變數來放大家相同的東西。 把變動縮小。縮小後才變成參數下去傳。 不然你就會遇到這樣的 stack overflow 的問題。 暗黑板主~我不太懂你的意思耶~採用大家相同的東西@@ 能在稍微講細一點嗎??意思說function變數太多了嗎?? 感謝解答! |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
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 發送簡訊給我 |
===================引 用 暗黑破壞神 文 章=================== 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 發送簡訊給我 |
這樣有解決你的問題了嗎?
至於怎麼記算,基本上,我們要看到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 發送簡訊給我 |
感謝暗黑板主,我會再研究看看的,至於我的問題已經解決了~謝謝^^
===================引 用 暗黑破壞神 文 章=================== 這樣有解決你的問題了嗎? 至於怎麼記算,基本上,我們要看到C怎麼去看待記憶體 以及變數的生命週期這一堆事情。 這說起來很長。自己要看書。 不過大致上的計算方式 function call 中有用到的,除了你有宣告 static 之外的變數。都會是佔用 stack 而 alloc 來的,是佔用 stack 了。 http://blog.chinaunix.net/u/26828/showart_292662.html 這邊有說明,你可以看一下。 應該就清楚為什麼我會跟你說要這樣處理了。
編輯記錄
kobebryant81 重新編輯於 2007-05-28 22:34:54, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |