全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3227
推到 Plurk!
推到 Facebook!

如何解決Stack Overflow

答題得分者是:aftcast
GGL
資深會員


發表:104
回覆:600
積分:335
註冊:2006-11-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-08-18 10:48:24 IP:140.118.xxx.xxx 未訂閱

//---------------------------------------------------------------------------
#include
#include
#include <math.h><br />#include
#include
#include
#include
#include
#pragma hdrstop

#include "Unit1.h"
#define TRUE 1
#define FALSE 0
#define pixel_count 22500 //image_size ^ 2
#define image_size 150
using namespace std;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

struct Position
{
int x;
int y;
struct Position *neighbor;
int neighbor_count;
};
Position position[pixel_count];
//DFS
struct Node_Mode1
{
int vertex;
Node_Mode1 *link;
};
//---------------------------------------------------------------------------
class TCon_Com_Mode1
{
public:
int count;
int visited[pixel_count];
AnsiString path;
Node_Mode1 *adjlist[pixel_count];
void LoadFromFile();
void show();
void dfs(int);
Node_Mode1 *searchlast(Node_Mode1 *);
};
//---------------------------------------------------------------------------
void TCon_Com_Mode1::LoadFromFile()
{
int tag=0;
for(int x=0;x {
for(int y=0;y {
position[tag].x=x;
position[tag].y=y;
tag ;
}
}
Node_Mode1 *nodes,*lastnode;
count=pixel_count;
for (int Vi=0;Vi {
visited[Vi]=false;
adjlist[Vi]=new Node_Mode1;
adjlist[Vi]->vertex=Vi;
adjlist[Vi]->link=NULL;
}
for (int Vi=0;Vi {
double Vj;
if(Vi==0)
{
for(int k=0;k<2;k )
switch(k)
{
case 0:
Vj=1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 1:
Vj=image_size;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
}
}
else if(Vi==(image_size-1))
{ for(int k=0;k<2;k )
switch(k)
{
case 0:
Vj=2*image_size-1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 1:
Vj=image_size-2;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
}
}
else if(Vi==pixel_count-image_size) //639200
{ for(int k=0;k<2;k )
switch(k)
{
case 0:
Vj=pixel_count-2*image_size;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 1:
Vj=pixel_count-image_size 1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
}
}
else if(Vi==pixel_count-1)
{ for(int k=0;k<2;k )
switch(k)
{
case 0:
Vj=pixel_count-image_size;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 1:
Vj=pixel_count-1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
}
}
else if(Vi>0 && Vi { for(int k=0;k<3;k )
switch(k)
{
case 0:
Vj=(position[Vi].x*image_size position[Vi].y) 1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 1:
Vj=(position[Vi].x*image_size position[Vi].y) image_size;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 2:
Vj=(position[Vi].x*image_size position[Vi].y)-1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
}
}
else if(Vi>(pixel_count-image_size) && Vi { for(int k=0;k<3;k )
switch(k)
{
case 0:
Vj=(position[Vi].x*image_size position[Vi].y)-image_size;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 1:
Vj=(position[Vi].x*image_size position[Vi].y) 1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 2:
Vj=(position[Vi].x*image_size position[Vi].y)-1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
}
}
else if( (Vi%image_size==0) && Vi!=0 && Vi!=(pixel_count-image_size))
{ for(int k=0;k<3;k )
switch(k)
{
case 0:
Vj=(position[Vi].x*image_size position[Vi].y)-image_size;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 1:
Vj=(position[Vi].x*image_size position[Vi].y) 1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 2:
Vj=(position[Vi].x*image_size position[Vi].y) image_size;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
}
}
else if(( (Vi 1)%image_size==0) && Vi!=(image_size-1) && Vi!=(pixel_count-1))
{ for(int k=0;k<3;k )
switch(k)
{
case 0:
Vj=(position[Vi].x*image_size position[Vi].y)-image_size;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 1:
Vj=(position[Vi].x*image_size position[Vi].y) image_size;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 2:
Vj=(position[Vi].x*image_size position[Vi].y)-1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
}
}
else if( (Vi%image_size!=0) && ((Vi 1)%image_size!=0))
{ for(int k=0;k<4;k )
switch(k)
{
case 0:
Vj=(position[Vi].x*image_size position[Vi].y)-image_size;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 1:
Vj=(position[Vi].x*image_size position[Vi].y) 1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 2:
Vj=(position[Vi].x*image_size position[Vi].y) image_size;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 3:
Vj=(position[Vi].x*image_size position[Vi].y)-1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
}
}


}

}
//---------------------------------------------------------------------------
Node_Mode1 *TCon_Com_Mode1::searchlast(Node_Mode1 *linklist)
{
Node_Mode1 *ptr;
ptr=linklist;
while (ptr->link!=NULL) ptr=ptr->link;
return ptr;
}

//---------------------------------------------------------------------------
void TCon_Com_Mode1::dfs(int v)
{
Node_Mode1 *ptr;
int w;
visited[v]=true;
int xi,yi;
xi=v/image_size;
yi=v%image_size;
Form1->Image1->Canvas->Pixels[xi][yi]=clBlue;
ptr=adjlist[v]->link;
while(ptr!=NULL)
{
w=ptr->vertex;
if (!visited[w])
dfs(w);
else
ptr=ptr->link;
};
}
//---------------------------------------------------------------------------
void TCon_Com_Mode1::show()
{
path="";
for (int v=0;v {
if (!visited[v])
{
dfs(v);
}
}
}
TCon_Com_Mode1 Con_Com;
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Con_Com.LoadFromFile();
Con_Com.show();
}
//---------------------------------------------------------------------------

以上是完整的程式碼。我的程式是在一個NxN的Image中執行Deep First Search,從(0,0)也就是左上角的點開始,
依照順時針方向(上->右->下->左)作search。

當我的image_size=150的時候程式還可以執行,但是設定到200,pixel_count=40000的時候,執行到一半就會出現stack overflow的錯誤,而我這個程式是要執行到800*800的圖片,請問該怎麼解決?謝謝

aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-08-18 18:05:13 IP:61.229.xxx.xxx 未訂閱

TCon_Com_Mode1 Con_Com;
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Con_Com.LoadFromFile();
Con_Com.show();
}
//---------------------------------------------------------------------------

要不要試著把上面的程式改成…


TCon_Com_Mode1 *Con_Com; // pointer
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Con_Com = new TCon_Com_Model1()
try
{
Con_Com->LoadFromFile();
Con_Com->show();
}
__finally
{
delete Con_Com;
}

}
//---------------------------------------------------------------------------

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-08-18 18:10:56 IP:61.229.xxx.xxx 未訂閱
還有,你的class還像沒實作解構子,但你確在法方裡new一堆的東西…
new 出來的東西是放在heap上,是要自己去清理的,放著不管…不久系統就會不穩或掛點…

應該在解構上把new出來的東西給清了!
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
GGL
資深會員


發表:104
回覆:600
積分:335
註冊:2006-11-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-08-19 20:19:05 IP:140.118.xxx.xxx 未訂閱

你好,我猜你指的應該是nodes=new Node_Mode1這一部份吧,這是因為要找出每個node的neighbor,因此會一直產生新的node,而且在程式的過程也不能清掉,因為這是用來記錄整個graphic的結構,還是說有其他清除的方法?謝謝

gyl_60939
一般會員


發表:0
回覆:4
積分:0
註冊:2006-08-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-08-20 01:49:21 IP:218.186.xxx.xxx 未訂閱

你好,請問你是每個像素都用一個a[img_size^2]表示嗎? 為什麼不用a[img_size][img_size]來表示呢

你的Stack Overflow可能是記憶體暴掉... 如果你正如樓上有人說過的, new的東西都沒有delete/delete[]


===================引 用 文 章===================

你好,我猜你指的應該是nodes=new Node_Mode1這一部份吧,這是因為要找出每個node的neighbor,因此會一直產生新的node,而且在程式的過程也不能清掉,因為這是用來記錄整個graphic的結構,還是說有其他清除的方法?謝謝

justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-08-20 20:45:28 IP:59.105.xxx.xxx 未訂閱
可以調整 project -> options -> Linker 右邊 的 Max stack size
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2006-08-21 21:16:03 IP:61.229.xxx.xxx 未訂閱

再仔細的看一下程式後我發現…原來你的問題並非我一開始覺得的。
因為把物件建在stack上是不好的,因為stack上有大小的限制,所以才建議你改create在heap上,但是…
我發現你所描述的問題並非程式一跑就overfow,所以… 你的objcet建在stack上是安全的…那為何還會overflow? 我有點納悶,所以又認真的看一次,原來…
你有用recursive function,難怪在某種程度上就stack overflow… 那method 叫 dsf。recursive function一定會有這個問題,僅管stack可以在linker上設定到最大值0x1000000,大約16MB多,但是也許還是不夠用,這不是解決問題的根本。要解決就要把演算法改一下,通常recursive的都可以改成非recursive的寫法,只是比較複雜一些。

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
GGL
資深會員


發表:104
回覆:600
積分:335
註冊:2006-11-05

發送簡訊給我
#8 引用回覆 回覆 發表時間:2006-08-22 11:09:36 IP:140.118.xxx.xxx 未訂閱
謝謝,我再試試看,我嘗試改非遞迴試試看
===================引 用 文 章===================

再仔細的看一下程式後我發現…原來你的問題並非我一開始覺得的。
因為把物件建在stack上是不好的,因為stack上有大小的限制,所以才建議你改create在heap上,但是…
我發現你所描述的問題並非程式一跑就overfow,所以… 你的objcet建在stack上是安全的…那為何還會overflow? 我有點納悶,所以又認真的看一次,原來…
你有用recursive function,難怪在某種程度上就stack overflow… 那method 叫 dsf。recursive function一定會有這個問題,僅管stack可以在linker上設定到最大值0x1000000,大約16MB多,但是也許還是不夠用,這不是解決問題的根本。要解決就要把演算法改一下,通常recursive的都可以改成非recursive的寫法,只是比較複雜一些。

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