C语言问题 高手来。。矩阵乘法中,关于动态分配二维数组,二维数组做形参问题。。实在搞不懂了。。
答案:3 悬赏:80 手机版
解决时间 2021-04-05 17:06
- 提问者网友:心如荒岛囚我终老
- 2021-04-04 18:09
C语言问题 高手来。。矩阵乘法中,关于动态分配二维数组,二维数组做形参问题。。实在搞不懂了。。
最佳答案
- 五星知识达人网友:雾月
- 2021-04-04 19:21
我个人认为这段代码主要有三个地方有错误:
1.void matrix_mult(B (*p1)[n1],B (*p2)[n2],int m,int n,int p,B (*p3)[n2])
(*p1)[n1],(*p2)[n2]和(*p3)[n2]这样写代表行指针,但其中的n1,n2必须是一个确定的整型,字符型等常量的(记忆有点模糊,不敢肯定这种说法百分百正确,建议楼主找下资料),应改为B **P1等。
2.scanf("%d",&a[i][j]);因为定义了double **a;所以应写成scanf("%lf", &a[i][j]);
3.for(i=0;i for(j=0;j scanf("%d",&a[i][j]);
这里楼主的意思应该是赋值给矩阵b的,但却写成了a,且%d的问题种上面的一样。
下面的代码就上面3点修改了一下,可以编译运行:
#include
#include
#define B double
void matrix_mult(double **p1,double **p2,int m,int n,int p,double **p3)
{
int i,j,k;
// printf("1\n");
for(i=0;i {
for(j=0;j {
for(k=0;k {
//printf("2\n");
//(*(*(p3+i)+j))+=(*(*(p1+i)+k))*(*(*(p2+k)+j));
// printf("%d\n",*(*(p3+i)+j));
p3[i][j] += p1[i][k] * p2[k][j];
}
}
}
}
B **mallocA(int m,int n) //定义动态二维数组函数
{
B **a;
int i;
a=(B**)malloc(m*sizeof(B*));
for(i=0;i a[i]=(B*)malloc(n*sizeof(B));
return a;
}
void free_a2d(B**a,int m) //释放内存
{
int i;
for(i=0;i free(a[i]);
free(a);
}
void main()
{
int i,j,m1,m2,n1,n2;
B **a,**b,**c;
do
{
printf("输入矩阵a的行数和列数:");
scanf("%d %d",&m1,&n1);
printf("\n");
printf("输入矩阵b的行数和列数:");
scanf("%d %d",&m2,&n2);
printf("\n");
if(n1!=m2)
printf("输入错误! 矩阵a的列数不等于矩阵b的行数!请重新输入!\n");
}
while(n1!=m2);
a=mallocA(m1,n1);
printf("输入矩阵a的所有元素(空格隔开,回车结束):");
for(i=0;i for(j=0;j scanf("%lf",&a[i][j]);
b=mallocA(m2,n2);
printf("输入矩阵b的所有元素(空格隔开,回车结束):");
for(i=0;i for(j=0;j scanf("%lf",&b[i][j]);
c=mallocA(m1,n2);
for(i=0;i for(j=0;j c[i][j]=0;
matrix_mult(a,b,m1,n2,m2,c); //!!!!!!!!!!!!!!!!!
printf("矩阵a乘矩阵b结果为:\n");
for(i=0;i {
for(j=0;j printf("%g ",c[i][j]);
printf("\n");
}
free_a2d(a,m1);
free_a2d(b,m2);
}
1.void matrix_mult(B (*p1)[n1],B (*p2)[n2],int m,int n,int p,B (*p3)[n2])
(*p1)[n1],(*p2)[n2]和(*p3)[n2]这样写代表行指针,但其中的n1,n2必须是一个确定的整型,字符型等常量的(记忆有点模糊,不敢肯定这种说法百分百正确,建议楼主找下资料),应改为B **P1等。
2.scanf("%d",&a[i][j]);因为定义了double **a;所以应写成scanf("%lf", &a[i][j]);
3.for(i=0;i
这里楼主的意思应该是赋值给矩阵b的,但却写成了a,且%d的问题种上面的一样。
下面的代码就上面3点修改了一下,可以编译运行:
#include
#include
#define B double
void matrix_mult(double **p1,double **p2,int m,int n,int p,double **p3)
{
int i,j,k;
// printf("1\n");
for(i=0;i
for(j=0;j
for(k=0;k {
//printf("2\n");
//(*(*(p3+i)+j))+=(*(*(p1+i)+k))*(*(*(p2+k)+j));
// printf("%d\n",*(*(p3+i)+j));
p3[i][j] += p1[i][k] * p2[k][j];
}
}
}
}
B **mallocA(int m,int n) //定义动态二维数组函数
{
B **a;
int i;
a=(B**)malloc(m*sizeof(B*));
for(i=0;i
return a;
}
void free_a2d(B**a,int m) //释放内存
{
int i;
for(i=0;i
free(a);
}
void main()
{
int i,j,m1,m2,n1,n2;
B **a,**b,**c;
do
{
printf("输入矩阵a的行数和列数:");
scanf("%d %d",&m1,&n1);
printf("\n");
printf("输入矩阵b的行数和列数:");
scanf("%d %d",&m2,&n2);
printf("\n");
if(n1!=m2)
printf("输入错误! 矩阵a的列数不等于矩阵b的行数!请重新输入!\n");
}
while(n1!=m2);
a=mallocA(m1,n1);
printf("输入矩阵a的所有元素(空格隔开,回车结束):");
for(i=0;i
b=mallocA(m2,n2);
printf("输入矩阵b的所有元素(空格隔开,回车结束):");
for(i=0;i
c=mallocA(m1,n2);
for(i=0;i
matrix_mult(a,b,m1,n2,m2,c); //!!!!!!!!!!!!!!!!!
printf("矩阵a乘矩阵b结果为:\n");
for(i=0;i
for(j=0;j
printf("\n");
}
free_a2d(a,m1);
free_a2d(b,m2);
}
全部回答
- 1楼网友:不甚了了
- 2021-04-04 21:03
程序错了
- 2楼网友:玩家
- 2021-04-04 20:29
无法编译吧?你是在什么平台上编译的?
上面的void matrix_mult(B (*p1)[n1],B (*p2)[n2],int m,int n,int p,B (*p3)[n2])
中的n1,n2没有声明出现编译错误
上面的void matrix_mult(B (*p1)[n1],B (*p2)[n2],int m,int n,int p,B (*p3)[n2])
中的n1,n2没有声明出现编译错误
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯