gpt4 book ai didi

机器编程时无法将 double 转换为 double *(高斯消除)项目

转载 作者:行者123 更新时间:2023-11-30 15:06:57 27 4
gpt4 key购买 nike

大家好,这是我的第一篇文章

这是我正在做的事情的一小部分

消除机器中的高斯误差

代码出现错误就像在函数 double* uptri(double (*)[17],int):cannot conversion 'double (*)[17]' to 'double*' in assignment

非常感谢任何形式的帮助

#include<stdio.h>
#include<math.h>

main()
{
double prob[16][17], GE[16][17],soln[16];
double *q,*r;
q=&GE[0][0];
r=&soln[0];

double* uptri(double[16][17], int);
double* solve(double[16][17], int);
int n,i,j;

n=2;

prob[0][0]=2;
prob[0][1]=3;
prob[0][2]=1;
prob[1][0]=1;
prob[1][1]=4;
prob[1][2]=2;

q=uptri(prob,n);

for(i=0;i<n;i++)
for(j=0;j<=n;j++)
printf("%lf\n",GE[i][j]);

r=solve(GE,n);

printf("Soln\n");

for(i=0;i<n;i++)
printf("%lf\n",soln[i]);

}

double* uptri(double A[16][17],int n)
{
int i,j,k;
double *p,temp;
p=&A[16][17];

for(i=0;i<n;i++)
for(k=i+1;k<n;k++)
{
temp=A[k][i]/A[i][i];
for(j=i;j<=n;j++)
A[k][j]=A[k][j]-temp*A[i][j];
}

for(i=0;i<n;i++)
for(j=0;j<=n;j++)
printf("%lf\n",A[i][j]);

return p;
}

double* solve(double A[16][17], int n)
{
int i,j,k;
double soln[16],*p,sum;
p=&soln[0];
soln[n-1]=A[n-1][n]/A[n-1][n-1];

for(i=n-2;i>=0;i--)
{
sum=0;
for(j=n-1;j>i;j--)
sum=sum+A[i][j]*soln[j];
soln[i]=(A[i][n]-sum)/A[i][i];
}

return p;
}

最佳答案

我没有得到你所遇到的编译器错误,但你有未定义的行为。

solve中,soln是其堆栈帧的一部分,因此当它返回时p将指向“稀薄的空气”。也就是说,堆栈帧可以立即被覆盖,因此 soln

解决这个问题的简单方法是将solve重新定义为:

void solve(double *soln,double A[16][17], int n)

然后从solve删除堆栈帧定义:

double soln[16]

此外,不需要 p

然后,从 main 中调用它:

solve(soln,GE,n);

现在,solve会将其数据返回到mainsoln

另外,请注意,在 uptri 中设置 p 指向数组末尾(再次,UB),但我没有解决这个问题,因为函数返回不是'没真正用过。

这是一个编译并运行的版本:

#include<stdio.h>
#include<math.h>

double* uptri(double[16][17], int);
void solve(double *,double[16][17], int);

int
main()
{
double prob[16][17], GE[16][17],soln[16];
//q=&GE[0][0];

int n,i,j;

n=2;

prob[0][0]=2;
prob[0][1]=3;
prob[0][2]=1;
prob[1][0]=1;
prob[1][1]=4;
prob[1][2]=2;

/*-q=-*/ uptri(prob,n);

for(i=0;i<n;i++)
for(j=0;j<=n;j++)
printf("%lf\n",GE[i][j]);

solve(soln,GE,n);

printf("Soln\n");

for(i=0;i<n;i++)
printf("%lf\n",soln[i]);

return 0;
}

double* uptri(double A[16][17],int n)
{
int i,j,k;
double *p,temp;
p=&A[16][17];

for(i=0;i<n;i++)
for(k=i+1;k<n;k++)
{
temp=A[k][i]/A[i][i];
for(j=i;j<=n;j++)
A[k][j]=A[k][j]-temp*A[i][j];
}

for(i=0;i<n;i++)
for(j=0;j<=n;j++)
printf("%lf\n",A[i][j]);

return p;
}

void
solve(double *soln,double A[16][17], int n)
{
int i,j;
double sum;

soln[n-1]=A[n-1][n]/A[n-1][n-1];

for(i=n-2;i>=0;i--)
{
sum=0;
for(j=n-1;j>i;j--)
sum=sum+A[i][j]*soln[j];
soln[i]=(A[i][n]-sum)/A[i][i];
}
}

关于机器编程时无法将 double 转换为 double *(高斯消除)项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38678250/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com