作者NoobImage (老人家)
看板C_and_CPP
标题[问题] 程式变换大小後出现 Stack overflow
时间Tue Feb 17 17:12:55 2009
----------------抱怨------------------
该死的BCB 常常出现一对不明BUG害我永远在DEBUG
--------------------------------------
----------------描述------------------
这个问题是 我程式一开始有 定义
#define H 150
#define W 200
这样子方便修改 静态矩阵又容易DEBUG
惊人的问题出现了
当我把
#define H 150
#define W 200
改成
#define H 512
#define W 512
跑出 Stack Overflow.....
-------------------------程式描述---------------------------
程式是跑到
void __fastcall TForm1::Button3Click(TObject *Sender)
{
A(); //产生随机高斯分布
B(); //SVD
}
error %$@# Stack Overflow
然後箭头指到
--> void B() 一开头
{
...
}
所以我怀疑错误是在 附程式 A(); 产生
在这里秀给大家看小弟写的超弱程式 不好意思 到底那里出问题
以下是 一个高斯分布 打散随机排列组合 32767是rand()的极限
我不知道 为什麽 150*200 可以过 512*512 出错 是哪里爆掉了
有请高手帮忙
使用CODE GUARD 他有产生一个OVERRUN在最後一段
for(int y=0;y<H;y++)
{
for(int x=0;x<W;x++)
{
if(x==0 && y!=0)
{
data[y][x]=data1[RandomIndex[y]/W][Rand
}
else if(y==0 && x!=0)
{
data[y][x]=data1[RandomIndex[x]/W][Rand
}
else
{
--------------> data[y][x]=data1[RandomIndex[x*y]/W][Ra
}
}
}
-----------------------------程式原始码------------------------
float z,sum;
z++;
sigma=1;
mean=127;
for(int x=0;x<256;x++)
{
z=-(x-mean)/sigma;
gaussian[x]=(1/pow(pi,0.5))*exp(-pow(z,2)/2) ;
sum+=gaussian[x];
}
for(int x=0;x<256;x++)
{
gaussian[x]=gaussian[x]/(sum+1); //normalize
gaussian[x]=gaussian[x]*(W*H); //distribution point
}
sum=0;
for(int x=0;x<256;x++)
{
sum+=gaussian[x];
}
//random index
randomize();
int n=1+(H*W)/32767; //If Image > 32767
for(int x=0;x<H*W;x++)
{
RandomIndex[x]=x+1;
}
for(int x=0;x<H*W;x++)
{
if(H*W > 32767)
{
int k,t;
k=(rand()*n) % (H*W);
if(k < H*W)
{
t=RandomIndex[k];
RandomIndex[k]=RandomIndex[x];
RandomIndex[x]=t;
}
}
else
{
int k,t;
k=rand() % (H*W);
t=RandomIndex[k];
RandomIndex[k]=RandomIndex[x];
RandomIndex[x]=t;
}
}
//Sort && Put Index
int count=0;
n=0;
for(int x=0;x<W;x++)
{
for(int y=0;y<H;y++)
{
data[y][x]=n;
data1[y][x]=n;
count++;
if(count >= gaussian[n])
{
if(n<255)
{
count=0;
n++;
}
else
{
n=n;
}
}
}
}
for(int y=0;y<H;y++)
{
for(int x=0;x<W;x++)
{
if(x==0 && y!=0)
{
data[y][x]=data1[RandomIndex[y]/W][RandomIndex[y]%W];
}
else if(y==0 && x!=0)
{
data[y][x]=data1[RandomIndex[x]/W][RandomIndex[x]%W];
}
else
{
data[y][x]=data1[RandomIndex[x*y]/W][RandomIndex[x*y]%W];
}
}
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 203.64.88.58
1F:推 wa120:我怎麽好像记得pow()也会overflow 但是不确定是不是这个问题 02/17 17:17
2F:推 visor:你一堆阵列宣告的大小都不知 02/17 17:24
3F:→ NoobImage:全部都是[H][W]或一维[H*W]啊 02/17 17:40
4F:→ NoobImage:只有这个 是gaussian[256] 02/17 17:41
5F:→ NoobImage:pow()不可能 那串数值是定值 02/17 17:43
6F:推 ledia:stack 预设只有 1M, 512x512 如果 type 是 int 一个就超过了 02/17 17:49
7F:推 TroyLee:该死的BCB? 02/17 18:46
8F:推 ledia:嗯 我想应该是原 po 的误会, 错怪 BCB 了 02/17 18:54
9F:推 rockmanray:BCB很nice的,这其中一定有什麽误会 02/17 19:48
10F:→ NoobImage:...我刚把stack加倍 过了 不过程式关闭会出现错误 02/17 20:06
11F:推 ledia:我建议你用动态配置, 程式关闭会有错这大概也是 stack 问题 02/18 00:06