c语言问题,改了好久还是不知道错在哪,求大神拯救

qq_39192013 2017-06-16 02:48:55
#include <stdio.h>
#include <stdlib.h>
#include<math.h>

int main()
{
int i,j,m=0,c=79,d=249;
float t0=226.85,tf=26.85,h=2800.0,Q=0.0,temp=0.0,N=187.0,EPS,X=1.0,e=0.1,f=0.1,delta=0.0001,sum = 0.0;
float a[80][250],t[80][250],del[80];
for(i=0;i<80;i++){
for(j=0;j<250;j++)
{
t[i][j]=100.0;
a[i][j]=100.0;
del[i]=1.0;
}
}

printf("%4.2lf\n",a[1][1]);
while(X>0.01){
m++;
for(i=0;i<=c;i++)
{
for(j=0;j<=d;j++)
{
if(j==0&&0<=i&&i<=c)
a[i][j]=t0;
else if(0<j&&j<d&&i==0)
a[i][j]=(2*t[1][j]+t[0][j+1]+t[0][j-1]+2*h*N*tf/N)/(4+2*h*delta/N);
else if(0<j&&j<d&&i==c)
a[i][j]=(2*t[c][j]+t[c+1][j+1]+t[c+1][j-1]+2*h*delta*tf/N)/(4+2*h*delta/N);
else if(j==d&&0<i&&i<c)
a[i][j]=(2*t[i][d]+t[i+1][d+1]+t[i-1][d+1]+2*h*delta*tf/N)/(4+2*h*delta/N);
else
a[i][j]=(t[i][j+1]+t[i][j-1]+t[i-1][j]+t[i+1][j])/4;
}
}
a[0][d+1]=(2*h*delta*tf/N+t[0][d]+t[1][d+1])/(2+2*h*delta/N);
printf("%4.2lf\n",a[0][250]);
a[c+1][d+1]=(2*h*delta*tf/N+t[c][d+1]+t[c+1][d])/(2+2*h*delta/N);
printf("%4.2lf\n",a[80][250]);
X=0.0;
for(i=0;i<=c;i++)
{
for(j=0;j<=d;j++)
{
EPS=fabs(t[i][j]-a[i][j]);
if(EPS>X) X=EPS;
}
}
if(m>100)
break;
}
if(m<100){
for(i=1;i<=80;i++)
del[i]=(t[i][0]-t[i][1])/delta;
sum+=del[i];
Q=N*sum*delta;
temp=t[40][250];
printf("%4.2lf %4.2lf",Q,temp);
printf("\n");

}
getchar();
}
提示process exited with return value 3221225477
我真的是要疯了求大神拯救
...全文
1010 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-06-16
  • 打赏
  • 举报
回复
static float a[80][250],t[80][250],del[80]; 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
自信男孩 2017-06-16
  • 打赏
  • 举报
回复
如果实在想不出怎么定义,可以考虑适当的加些注释,比如在算法逻辑方面,可以加一行的注释,也可以在文件头或者函数前加若干行注释用于描述可能不好理解的逻辑
自信男孩 2017-06-16
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include<math.h>

int main()
{
    int i,j,m=0,c=79,d=249;
    float t0=226.85,tf=26.85,h=2800.0,Q=0.0,temp=0.0,N=187.0,EPS,X=1.0,e=0.1,f=0.1,delta=0.0001,sum = 0.0;
    float a[80][250],t[80][250],del[80];
    for(i=0;i<80;i++){
        for(j=0;j<250;j++)
        {
            t[i][j]=100.0;
            a[i][j]=100.0;
            del[i]=1.0;
        }
    }

    printf("%4.2lf\n",a[1][1]);
    while(X>0.01){
        m++;
        for(i=0;i<=c;i++)
        {
            for(j=0;j<=d;j++)
            {
                if(j==0&&0<=i&&i<=c)
                    a[i][j]=t0;
                else if(0<j&&j<d&&i==0)
                    a[i][j]=(2*t[1][j]+t[0][j+1]+t[0][j-1]+2*h*N*tf/N)/(4+2*h*delta/N);
                else if(0<j&&j<d&&i==c)
                    a[i][j]=(2*t[c][j]+t[c+1][j+1]+t[c+1][j-1]+2*h*delta*tf/N)/(4+2*h*delta/N);
                else if(j==d&&0<i&&i<c)
                    a[i][j]=(2*t[i][d]+t[i+1][d+1]+t[i-1][d+1]+2*h*delta*tf/N)/(4+2*h*delta/N);
                else
                    a[i][j]=(t[i][j+1]+t[i][j-1]+t[i-1][j]+t[i+1][j])/4;
            }
        }
        a[0][d+1]=(2*h*delta*tf/N+t[0][d]+t[1][d+1])/(2+2*h*delta/N);
        printf("%4.2lf\n",a[0][249]);
        a[c+1][d+1]=(2*h*delta*tf/N+t[c][d+1]+t[c+1][d])/(2+2*h*delta/N);
        printf("%4.2lf\n",a[79][249]);
        X=0.0;
        for(i=0;i<=c;i++)
        {
            for(j=0;j<=d;j++)
            {
                EPS=fabs(t[i][j]-a[i][j]);
                if(EPS>X) X=EPS;
            }
        }
        if(m>100)
            break;
    }
    if(m<100){
        for(i=1;i<=80;i++)
            del[i]=(t[i][0]-t[i][1])/delta;
        sum+=del[i];
        Q=N*sum*delta;
        temp=t[40][249];
        printf("%4.2lf %4.2lf",Q,temp);
        printf("\n");

    }
    getchar();
}
楼主,看到你定以那么多变量(真需要那么多),并且变量大多以单个字母命令,怎么也才不出来你定义这个变量做什么,自己疯了,让别人看你的代码也感觉摸不着头脑; 程序里有多处越界,数据长度是250,那么其下标是从[0, 249]里,同理,长度是80,那么下标是从[0, 79]; 建议楼主,以后写代码可以先构思,变量不是写多了就好分析和理解了,多了自己看着头大,别人看着更是费劲。从你的程序里也看不出你的逻辑是要做什么。所以,先构思好;其次,对于一些变量有通用的命名的,比如循环变量,i, j, k;一般用在循环和数组下标,另外,n或着num一般是number的缩写,cnt是count的缩写,用于分别标识数字和计数器。总之,除了这些通用的命名法之外,定义变量和函数都建议做到见名知义。
战在春秋 2017-06-16
  • 打赏
  • 举报
回复
数组越界错误: C语言数组索引从0开始,a[80][250]最大的元素索引只能到a[79][249]。
c = 79, d = 249
a[c+1][d+1]=(2*h*delta*tf/N+t[c][d+1]+t[c+1][d])/(2+2*h*delta/N); //试图设置a[80][250],不合法。
用心回答每个问题,如果对您有帮助,请采纳答案好吗,谢谢!
zhujinqiang 2017-06-16
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
static float a[80][250],t[80][250],del[80]; 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
qwqwqw408 2017-06-16
  • 打赏
  • 举报
回复
最简单就是4楼的办法,或者修改项目属性,改为不限制栈大小。

69,371

社区成员

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

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