数组越界的问题

猫熊学习 2011-09-23 11:17:13


#include <stdio.h>

#include <math.h>
#define d 6 //多项式维数
#define D d+1

#define M 5
#define N 8

int main( )
{
int i,j;
float a,b,c;
float p[d][d] = {0};//全部初始化为0


p[0][0]=1; p[1][0]=0; p[1][1]=1;
for (int n=0; n<d; n++)
{
for (int k=0;k<d;k++)
{
/*
if (n<k)
{ p[n][k]=0;

}
*/
//else
//{
if (k<1)
a=0;
else
a=p[n][k-1];

if (n<1)
b=0;
else
b=p[n-1][k];
c= a*(2*n+1)/(n+1)-b*n/(n+1.0);

if (n+1>d)
break;
else
p[n+1][k]=c;
//}




p[0][0]=1; p[1][0]=0; p[1][1]=1;

}

}



float sum[D][D]={0};
float res[d][d]={0};
float rest[M][N]={0};

int z=1;

for (int m1=0; m1<=d; m1++){

for (int n1=0; n1<=d-m1-1; n1++){

for (int m2=0; m2<=M-1; m2++){

for (int n2=0; n2<=N-1; n2++){

for (int t1=0; t1<=m1; t1++){

for (int t2=0; t2<=n1; t2++){

sum[m1][n1]+=z*(2*m1+1)*(2*n1+1)*p[m1][t1]*p[n1][t2]*pow((2*m2/M-1),t1)*pow((2*n2/N-1),t2)/(M*N);

}
}
}
}
}
}



for(int k=0;k<=d;k++){

for(int l=0;l<=d-k-1;l++){

for (int m3=0;m3<=d;m3++){

for (int n3=0;n3<=d-m3-1;n3++){

if (m3>=k && n3>=l)
for(int k1=k;k1<=m3;k1++){

for(int l1=l;l1<=n3;l1++){

// float z1=1;
// float z2=1;

// k1大于k
float aa1,aa2,bb1,bb2,cc1,cc2,z1,z2;


//aa1=k;
float res1=1,res2=1,res3=1,res4=1,res5=1,res6=1;

for ( bb1=k1;bb1>=1;bb1--)
{ res1=res1*bb1;

}

for ( aa1=k ;aa1>=1;aa1--)
{ res2=res2*aa1;

}

for ( cc1=k1-k ;cc1>=1;cc1--)
{ res3=res3*cc1;

}


z1=res1/(res2*res3);



// for (l=1;l<=l1;l++)
//
for ( bb2=l1;bb2>=1;bb2--)
{res4=res4* bb2 ;

}
for ( aa2=l ;aa2>=1;aa2--)
{ res5=res5* aa2 ;

}

for ( cc2=l1-l ;cc2>=1;cc2--)
{ res6=res6* cc2 ;

}


z2=res4/(res5*res6);

res[k][l]+=pow(-1, k1+l1-k-l)*pow(2, k+l)*z1*z2*sum[m3][n3]*p[m3][k1]*p[n3][l1];


}

}

else
continue;


}


}


}


}




//float ttt=0;
/*
for (int j4=0;j4<M;j4++ ){

for (int j3=0;j3<N;j3++ ){

// for (float x=0; x<=1;x=x+1/M){
// for (float y=0; y<=1;y=y+1/N){

for (int kk=0;kk<=d;kk++){
for (int ll=0;ll<=d-kk;ll++){

rest[j4][j3]=pow(1/(j4+1),kk)*pow(1/(j3+1),ll)*res[kk][ll]+rest[j4][j3];

}
}


}
}


*/
//}
//}


for (i=0;i<d;i++) //输出矩阵
{
for (j=0;j<d;j++)
{
printf("% 6f ",res[i][j]);
}
printf("\n");
}

/*
for (i=0;i<M;i++) //输出矩阵
{
for (j=0;j<N;j++)
{
printf("% 6f ",rest[i][j]);
}
printf("\n");
}




*/
}
















d设置为4时,没有问题,设置为7时就有问题出现?什么原因?
...全文
165 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
A13433758072 2011-09-29
  • 打赏
  • 举报
回复
a=p[n][k-1负数];b=p[n-1负数][k];



看不 下去了
hondely 2011-09-29
  • 打赏
  • 举报
回复
代码看不下了 那个for太多了 肯定有更简单方法

什么问题啊
猫熊学习 2011-09-29
  • 打赏
  • 举报
回复
不用管for多不多,ok?就是这样写的,咋办?
[Quote=引用 4 楼 proorck6 的回复:]
你的代码在我脑子里越界了,所以我无法回答你的问题。
建议把问题简化,可能答案自己就出来了。
[/Quote]
AndyZhang 2011-09-29
  • 打赏
  • 举报
回复
pow里面要求是double类型,强制转换
尘缘udbwcso 2011-09-29
  • 打赏
  • 举报
回复
楼主要解决什么问题?
说不定有更好的算法
  • 打赏
  • 举报
回复
还有当
pow参数为double float等类型,不包括int型,所以

最好把其参数强制类型转换下,vs下报错
  • 打赏
  • 举报
回复

int i,j;
float a,b,c;
float p[d][d] = {0};//全部初始化为0


p[0][0]=1; p[1][0]=0; p[1][1]=1;
for (int n=0; n<d; n++)
{
for (int k=0;k<d;k++)
{
/*
if (n<k)
{ p[n][k]=0;

}
*/
//else
//{
if (k<1)
a=0;
else
a=p[n][k-1];

if (n<1)
b=0;
else
b=p[n-1][k];
c= a*(2*n+1)/(n+1)-b*n/(n+1.0);

if (n+1>d)
break;
else
p[n+1][k]=c; //mark, 在这块的时候,当n=d-1的时候,n+1=d,所以就成了 p[d][k],这样明显越界了
//}




p[0][0]=1; p[1][0]=0; p[1][1]=1;

}

}
快乐的小菜鸟 2011-09-23
  • 打赏
  • 举报
回复
代码太长 一般这种问题 直接断点 step
肖老板 2011-09-23
  • 打赏
  • 举报
回复
顶一个。
hongwenjun 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 proorck6 的回复:]

你的代码在我脑子里越界了,所以我无法回答你的问题。
建议把问题简化,可能答案自己就出来了。
[/Quote]

看不习惯 这么多 for 嵌套的代码
proorck6 2011-09-23
  • 打赏
  • 举报
回复
你的代码在我脑子里越界了,所以我无法回答你的问题。
建议把问题简化,可能答案自己就出来了。
猫熊学习 2011-09-23
  • 打赏
  • 举报
回复
多谢大神指教啊。
[Quote=引用 2 楼 namelij 的回复:]
还有当
pow参数为double float等类型,不包括int型,所以

最好把其参数强制类型转换下,vs下报错
[/Quote]

69,369

社区成员

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

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