高手帮个忙,看看这个程序,讲讲程序错误是哪引起的

lengend 2004-05-06 01:16:42
朋友用vc建立的console程序,执行时说,stack overflow
帮忙看看是程序哪个部分引起的
顺便讲讲编译后的程序,堆栈的分配情况.分不够再加,呵呵
头文件ran1.h如下:
#define IA 16807
#define IM 2147483647
#define AM (1.0/IM)
#define IQ 127773
#define IR 2836
#define NTAB 32
#define NDIV (1+(IM-1)/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)

float ran1(long *idum){
int j;
long k;
static long iy=0;
static long iv[NTAB];
float temp;

if (*idum<=0||!iy){
if (-(*idum)<1) *idum=1;
else *idum=-(*idum);
for (j=NTAB+7;j>=0;j--) {
k=(*idum)/IQ;
*idum=IA*(*idum-k*IQ)-IR*k;
if (*idum<0) *idum+=IM;
if (j<NTAB) iv[j]=*idum;
}
iy=iv[0];
}
k=(*idum)/IQ;
*idum=IA*(*idum-k*IQ)-IR*k;
if (*idum<0) *idum+=IM;
j=iy/NDIV;
iy=iv[j];
iv[j]=*idum;
if ((temp=AM*iy)>RNMX) return RNMX;
else return temp;
}




主文件sm.c如下:
#include <math.h>
#include <stdio.h>
#include "ran1.h"

#define PI 3.1415926
#define N 1000 //*****************************
#define IMAX 10.0
#define TM 4000
#define STEP 1.0
#define AII 2.0
#define AIJ 1.3
#define AO 1.0
#define CW 1.0



long idum;

void wsmodel(int n,float p0,int k0,float edge[N][N]) //数组指针可以这样用吗?
{
int i,j,k,r,num[N];
float f1,f2;
extern idum;

//初始化
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
edge[i][j]=0;
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if((i<j) && (j<=(i+k0))) edge[i][j]=1;
}
}
for(i=(n-k0);i<n;i++)
{
for(j=0;j<k0;j++)
{
if(j<=(i+k0-n)) edge[i][j]=1;
}
}
//构造网络
for(j=1;j<=k0;j++)
{
for(i=0;i<n;i++) num[i]=0;
idum=10;
for(i=0;i<n;i++)
{
f1=ran1(&idum);
if(f1<p0) num[i]=1;
}
f1=ran1(&idum);
idum=(int)(n*f1);
for(i=0;i<n;i++)
{
if(num[i]==1)
{
l1: f2=ran1(&idum);
r=(int)(n*f2);
if(edge[i][r]==0 && edge[r][i]==0 && i!=r)
{
edge[i][r]=1;
if((i+j)<n)
{
edge[i][i+j]=0;
}
else
{
edge[i][i+j-n]=0;
}
}
else
{
goto l1;
}
}
}
}
return 0;
}

float white()
{
float noise_a,noise_b,noise;
noise_a=ran1(&idum);
noise_b=ran1(&idum);
noise=sqrt(-4.0*10*STEP*log(noise_a))*cos(2*PI*noise_b);
return (noise);
}

main()
{
int i,j,t=0,flag1[N]={0},flag2[N]={0},flag3[N]={0},cunt=0,hist=0;
float edge[N][N],xo[N]={0},x[N][N]={0},y[N]={0},cur[N]={0},e_o,e_x,e_y;
float cri[N],last[N]={0},w,wsf,aver;

FILE *fp;
FILE *fp1;
FILE *fp2;
fp=fopen("电压.txt","w");
fp1=fopen("number.txt","w");
fp2=fopen("直方图.txt","w");

wsmodel(N,0.025,2,edge);
e_o=exp(-STEP/10.0);
e_x=exp(-STEP/1000.0);
e_y=e_x;
wsf=CW/N;

for(i=0;i<N;i++)
{
cri[i]=1000.0;
}

for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
w=-ran1(&idum)*wsf;
if(ran1(&idum)<0.5) w*=-1.0;
edge[i][j]*=w;
}
}


while(t<TM)
{
cunt=0;
for(i=0;i<N;i++)
{
cur[i]=10*sin(t*2*PI/100.0);

cur[i]=white();
xo[i]=e_o*xo[i]+STEP*cur[i]*AO;
y[i]=y[i]+xo[i]*STEP;
for(j=0;j<N;j++)
{
x[i][j]=e_x*x[i][j];
if(flag3[j]==1) x[i][j]+=AIJ;
y[i]=y[i]+edge[i][j]*x[i][j]*STEP;
}
if(y[i]<0) y[i]=0;

if(last[i]!=0)
{
cri[i]=1000.0+1500.0*exp(-(t+STEP-last[i])/15.0)*cos(exp(-(t+STEP-last[i])/70.0)*(t+STEP-last[i])/7.0);
}

if(y[i]>=cri[i])
{
flag1[i]=1;
y[i]-=cri[i];
cunt++;
last[i]=t+1.0;
}
else
{
flag1[i]=0;
}
}

t+=STEP;


aver=0;
for(i=0;i<N;i++)
{
flag3[i]=flag2[i];
flag2[i]=flag1[i];
aver+=y[i];
}
aver/=N;
fprintf(fp,"%d %f\n",t,aver);
fprintf(fp1,"%d %d\n",t,cunt);
hist+=cunt;
if((t+1)%10==0) {fprintf(fp2,"%d %d\n",t-4,hist);hist=0;}
}
fclose(fp);
}
...全文
49 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
shadow22 2004-05-06
  • 打赏
  • 举报
回复
关注
freefalcon 2004-05-06
  • 打赏
  • 举报
回复
楼主分真多啊,我在这里做了回复
http://expert.csdn.net/Expert/topic/3035/3035958.xml?temp=.9556238
不过由于不能连续回复3次,所以我只好把没有说完的话放在这里了

stack设置方法为:
执行菜单project>setting>link>output>stack allocations
设置reserve为10000000(大概数字),在我这里不会溢出了,不过好像运行要很长时间
当然更好的方法还是动态分配内存,这个就不多说了吧

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧