谁帮我看看这个程序的错误啊~我是win7 64位,编译无错误,每次运行都无响应。

程序:电磁学用有限差分法解静电场边值问题这里是方法原理:http://wenku.baidu.com/view/3590b8d726fff705cc170abd.html... 程序:电磁学用有限差分法解静电场边值问题
这里是方法原理:
http://wenku.baidu.com/view/3590b8d726fff705cc170abd.html

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define pi 3.1415926
double LV,RV,TV,DV,LH,WH;
double **a,w,SL,alfa=1.3;
int x,y,i,j;
static int flag=0;

//获得一行或一列的节点数
int fun4(double h,double sl)
{
int result=0;
while(h>0)
{
h=h-sl;
result++;
}
return result+1;
}
//检测是否达到制定精度
int fun3(double **a,double**b,double w)
{
if(fabs(**a-**b)<=w)
return 1;
else
return 0;
}

//进行逐次超松弛迭代
void fun2(double **u,double alfa,double w)
{
int i,j;
double **a={0},**b={0};
for(j=0;j<y;j++)
for(i=0;i<x;i++)
{
a[j][i]=u[j][i];
b[j][i]=u[j][i];
}
flag++;
for(j=1;j<y-1;j++)
for(i=1;i<x-1;i++)
{
b[j][i]=a[j][i]+(alfa*(a[j][i+1]+a[j+1][i]+b[j][i-1]+b[j-1][i]-4*a[j][i]))/4;

}
for(j=1;j<y-1;j++)
for(i=1;i<x-1;i++)
if(!fun3(a,b,w))
fun2(b,alfa,w);
else
u[j][i]=b[j][i];
}

//初始化(ui取0)
void fun1(double **u,int x,int y)
{
int i,j;
for(j=0;j<y;j++)
for(i=0;i<x;i++)
{
u[j][i]=0;
if(j==0)
u[j][i]=DV;
if(j==y-1)
u[j][i]=TV;
if(i==0)
u[j][i]=LV;
if(i==x-1)
u[j][i]=RV;
}

}

void main()
{
printf("学号:20104450320 班级:电力103班 姓名:陈敏林\n");
printf("请输入左端边界电压值:\n");
scanf("%lf",&LV);
printf("请输入右端边界电压值:\n");
scanf("%lf",&RV);
printf("请输入顶部边界电压值:\n");
scanf("%lf",&TV);
printf("请输入底部边界电压值:\n");
scanf("%lf",&DV);
printf("请输入矩形槽的宽度:\n");
scanf("%lf",&WH);
printf("请输入矩形槽的高度:\n");
scanf("%lf",&LH);
printf("请输入矩形的步距:\n");
scanf("%lf",&SL);
printf("请输入相邻两次迭代值的指定的最大允许误差:\n");
scanf("%lf",&w);

x=fun4(WH,SL);
y=fun4(LH,SL);

a=(void *)malloc(sizeof(double) * y);
if(a==NULL)
{
printf("内存分配不足!");
return;
}
for(i=0;i<y;i++)
{
a[i]=(double *)malloc(sizeof(double)* x);
if(a[i]==NULL)
{
printf("内存分配不足!");
return;
}
}

fun1(a,x,y);

fun2(a,alfa,w);

printf("迭代次数为:%d\n",&flag);
printf("计算结果如下:\n");
for(j=0;j<y;j++)
for(i=0;i<x;i++)
{
printf("%lf",a[j][i]);
}
}
展开
 我来答
vinx123
推荐于2016-04-26
知道答主
回答量:25
采纳率:0%
帮助的人:26.9万
展开全部
这个程序真是害死人呀!你的程序fun2里面声明的a和b没有分配空间,直接拿来赋值,运行起来肯定有问题。另外,在fun2里重复迭代,如果申请空间的话,不好管理,不如在外围申请空间,用两个相同大小的二维数组,将里面的值倒来倒去。
下面的代码可以正常运行,而且满足你作业的要求。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define pi 3.1415926
double LV, RV, TV, DV, LH, WH;
int x,y;
int flag = 0;

//获得一行或一列的节点数
int fun4(double h,double sl)
{
int result=0;
while(h>0)
{
h=h-sl;
result++;
}
return result+1;
}
//检测是否达到制定精度
int fun3(double **a,double **b,double w)
{
int i, j;
for(j=1; j<y-1; j++)
for(i=1; i<x-1; i++)
if(fabs(a[j][i]-b[j][i]) > w)
return 0;

return 1;
}

//进行逐次超松弛迭代
void fun2(double **in,double alfa,double w, double** out)
{
int i,j;

flag++;
for(j=1; j<y-1; j++)
for(i=1; i<x-1; i++)
out[j][i]=in[j][i]+(alfa*(in[j][i+1]+in[j+1][i]+out[j][i-1]+out[j-1][i]-4*in[j][i]))/4;

if(!fun3(in,out,w))
fun2(out,alfa,w,in);

return;
}

//初始化(ui取0)
void fun1(double **u,int x,int y)
{
int i,j;
for(j=0; j<y; j++)
for(i=0; i<x; i++)
{
u[j][i]=0;
if(j==0)
u[j][i]=DV;
if(j==y-1)
u[j][i]=TV;
if(i==0)
u[j][i]=LV;
if(i==x-1)
u[j][i]=RV;
}

}

int main()
{
double SL, w, alfa = 1.3;
double **a, **b;
int i,j,temp;

printf("学号:20104450320 班级:电力103班 姓名:陈敏林\n");
printf("请输入左端边界电压值:\n");
scanf("%lf",&LV);
printf("请输入右端边界电压值:\n");
scanf("%lf",&RV);
printf("请输入顶部边界电压值:\n");
scanf("%lf",&TV);
printf("请输入底部边界电压值:\n");
scanf("%lf",&DV);
printf("请输入矩形槽的宽度:\n");
scanf("%lf",&WH);
printf("请输入矩形槽的高度:\n");
scanf("%lf",&LH);
printf("请输入矩形的步距:\n");
scanf("%lf",&SL);
printf("请输入相邻两次迭代值的指定的最大允许误差:\n");
scanf("%lf",&w);

x=fun4(WH,SL);
y=fun4(LH,SL);

a=(double**)malloc(sizeof(double) * y);
b=(double**)malloc(sizeof(double) * y);
if(a==NULL || b==NULL)
{
printf("内存分配不足!");
return -1;
}
for(i=0; i<y; i++)
{
a[i]=(double*)malloc(sizeof(double) * x);
b[i]=(double*)malloc(sizeof(double) * x);
if(a[i]==NULL || b[i]==NULL)
{
printf("内存分配不足!");
return -1;
}
}

fun1(a, x, y);
fun1(b, x, y);

fun2(a, alfa, w, b);

printf("迭代次数为:%d\n", flag);
//最终结果,迭代偶数次,写在a里;奇数次写到b里了
temp = flag % 2;
printf("计算结果如下:\n");
for(j=0; j<y; j++)
{
for(i=0; i<x; i++)
{
if(temp)
printf("%lf ",b[j][i]);
else
printf("%lf ",a[j][i]);
}
printf("\n");
if (b[j])
free(b[j]);
if (a[j])
free(a[j]);
}
if (b)
free(b);
if (a)
free(a);

return 0;
}
zzhydf
2012-04-17
知道答主
回答量:4
采纳率:0%
帮助的人:3.3万
展开全部
可以运行,但出现:。。。 中的 0x779215de 处有未经处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
帐号已注销
2012-04-17 · TA获得超过1418个赞
知道大有可为答主
回答量:1903
采纳率:0%
帮助的人:1840万
展开全部
帮顶,现在不方便,晚上回去看。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式