看板 C_and_CPP 關於我們 聯絡資訊
先進: 抱歉!小弟初學,如有不足或詞意不明請多多包涵。 遇到的問題: 使用Recursive,出現問題stack overflow -.- 希望得到的正確結果: 和本問題不相關的,想一起問先進的!!以下資訊是!?謝謝。 'VC08182010.exe': Loaded 'D:\Program\Vehicle_LicensePlate\VC08182010\Debug\VC08182010.exe', Symbols loaded. 'VC08182010.exe': Loaded 'C:\Windows\System32\ntdll.dll', Cannot find or open the PDB file 'VC08182010.exe': Loaded 'C:\Windows\System32\kernel32.dll', Cannot find or open the PDB file 'VC08182010.exe': Loaded 'C:\Windows\System32\KernelBase.dll', Cannot find or open the PDB file 'VC08182010.exe': Loaded 'C:\Windows\System32\msvcr100d.dll', Symbols loaded. 'VC08182010.exe': Loaded 'C:\Windows\System32\apphelp.dll', Cannot find or open the PDB file 以下是錯誤資訊!! First-chance exception at 0x000425ea in VC08182010.exe: 0xC00000FD: Stack overflow. Unhandled exception at 0x000425ea in VC08182010.exe: 0xC00000FD: Stack overflow. The program '[1336] VC08182010.exe: Native' has exited with code -1073741571 (0xc00000fd). 程式說明: 此function為要在圖片上找尋是否有255的光點如有的話 ,進行connected component label由1~n,圖片大小目前為640*480。 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) win7 / VC++ 2010 有問題的code: (請善用置底文標色功能) // The function is 8-neighborhood #include <stdio.h> #include <stdlib.h> void FindPixels(unsigned char **, int, int, int *, int ,int); int ConnectedComponents(unsigned char **Y_Difference, int Width, int Height) { int i, j; int block = 1; // candidate number char file_name_ConnectedComponents[] = "ConnectedComponents"; WriteXls(Y_Difference, file_name_ConnectedComponents, Width, Height); for(i = 0; i <= Height - 1; i++) for(j = 0 ; j <= Width - 1; j++){ if(255 == *(*(Y_Difference + i) + j)){ printf("\nCandidate %d", block); FindPixels(Y_Difference, i, j, &block, Width, Height); block++; } } block--; return block; } void FindPixels(unsigned char **Y_Difference, int i, int j, int *block, int Width, int Height) { *(*(Y_Difference + i) + j) = *block; if(i - 1 >=0 && j - 1 >= 0 && 255 == *(*(Y_Difference + i - 1) + j - 1)) FindPixels(Y_Difference, (i - 1), (j - 1), block, Width, Height); if(i - 1 >=0 && 255 == *(*(Y_Difference + i - 1) + j )) FindPixels(Y_Difference, (i - 1), (j ), block, Width, Height); if(i - 1 >= 0 && j + 1 <= Width - 1 && 255 == *(*(Y_Difference + i - 1) + j + 1)) FindPixels(Y_Difference, (i - 1), (j + 1), block, Width, Height); if(j - 1 >= 0 && 255 == *(*(Y_Difference + i ) + j - 1)) FindPixels(Y_Difference, (i ), (j - 1), block, Width, Height); if(j + 1 <= Width - 1 && 255 == *(*(Y_Difference + i ) + j + 1)) FindPixels(Y_Difference, (i ), (j + 1), block, Width, Height); if(i + 1 <= Height - 1 && j - 1 >= 0 && 255 == *(*(Y_Difference + i + 1) + j - 1)) FindPixels(Y_Difference, (i + 1), (j - 1), block, Width, Height); if(i + 1 <= Height - 1 && 255 == *(*(Y_Difference + i + 1) + j )) FindPixels(Y_Difference, (i + 1), (j ), block, Width, Height); if(i + 1 <= Height - 1 && j + 1 <= Width - 1 && 255 == *(*(Y_Difference + i + 1) + j + 1)) FindPixels(Y_Difference, (i + 1), (j + 1), block, Width, Height); return; } /* 8-neighborhood Connected Components Label pixel location is (x, y) for start, and other pixels of find pixels (x - 1, y - 1) (x - 1, y ) (x - 1, y + 1) (x , y - 1) (x , y ) (x , y + 1) (x + 1, y - 1) (x + 1, y ) (x + 1, y + 1) */ 補充說明: 紅色的字為遞迴。 1.是否是我的遞迴執行過多次!?程式錯誤在4377的遞迴,4377以下的遞迴皆可完成。 但是目前知其中一區塊需遞迴5003次還可以跑完。 2.有試著改爬文中先進所說的變更stack size還是一樣不行,想請問所改的/Fnumber 這number指的是byte還是!?可能是我試的不夠大嗎!? 3.若在X86上以如此,如移植到DSP晶片上是否應該更不盡理想吧!? 4.是否有撰寫遞迴時須注意的小地方!? 5.或許除了使用遞迴之外是否有比較理想的方式!? 先感謝,回應的先進。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.240.245.74 ※ 編輯: MaconChou 來自: 210.240.245.74 (09/01 13:27)
holymars:...請不要用遞迴寫 改用陣列模擬或乾脆改成BFS 09/01 14:33
yauhh:你的遞迴式看起來一直遞迴,但是沒有哪個遞迴呼叫之後是有個 09/01 20:24
yauhh:終點的. 遞迴函式沒有底. 09/01 20:24
yauhh:哦,我還沒看完.抱歉,遞迴函式有底. 09/01 20:27
VictorTom:找CC只要圖片大一點連的component多一點, 遞迴就可能直 09/01 21:36
VictorTom:接call到爆掉; 解法就是1F h大說的XD 09/01 21:37
MaconChou:感謝各位先進指教,我用h大的BFS方式來撰寫看看。 09/03 16:53
MaconChou:請問還有請問h大您所指的陣列模擬可以細說一下嗎!?謝 09/03 16:54
MaconChou:剛剛看了Re,很感謝y大的細說以及l大的說明都可讓小弟有 09/03 17:15
MaconChou:深思的地方,真的很感謝!! 09/03 17:15