我试图使用乘法来计算矩阵A的幂。 我遇到了ArrayPower函数的问题。它不起作用,我认为它应该。但MultiArray功能似乎工作正常。任何人都可以帮助我吗?
#include <stdio.h>
int** MultiArray(int a[2][2],int b[2][2]);
int** ArrayPower(int a[2][2],int e);
int main(void)
{
int fa[2][2];
fa[0][0]=0;
fa[0][1]=1;
fa[1][0]=1;
fa[1][1]=1;
int **multifa=malloc(sizeof(int)*2);
for (int i=0;i<2;i++) {
multifa[i]=malloc(sizeof(int)*2);
}
multifa=ArrayPower(fa,2);
printf("%d %d\n",multifa[0][0],multifa[0][1]);
printf("%d %d\n",multifa[1][0],multifa[1][1]);
return 0;
}
int** MultiArray(int a[2][2], int b[2][2]) {
//multi a *b
//memory allocation
int i,rows=2,cols=2;
int **c=malloc(rows*sizeof(int));
for (i=0;i<rows;i++) {
c[i]=malloc(cols*sizeof(int));
}
c[0][0]=a[0][0]*b[0][0]+a[0][1]*b[1][0];
c[0][1]=a[0][0]*b[0][1]+a[0][1]*b[1][1];
c[1][0]=a[1][0]*b[0][0]+a[1][1]*b[1][0];
c[1][1]=a[1][0]*b[0][1]+a[1][1]*b[1][1];
return c;
}
int** ArrayPower(int a[2][2],int e) {
//memory allocation
int i,rows=2,cols=2;
int **c=malloc(rows*sizeof(int));
for (i=0;i<rows;i++) {
c[i]=malloc(cols*sizeof(int));
}
c[0][0]=a[0][0];
c[0][1]=a[0][1];
c[1][0]=a[1][0];
c[1][1]=a[1][1];
for (i=1;i<e;i++) {
c=MultiArray(a,c);
}
return c;
}
答案 0 :(得分:0)
MultiArray
被声明为采用int [2][2]
类型的第二个参数,但是使用c
参数调用它,其类型为int **
。这些是不兼容的类型。
在参数中,类型int [2][2]
会自动转换为指向两个int
数组的指针,类型为int (*)[2]
。这是一个指向有两个int
个对象的地方的指针(因为我们知道它是两个int
个对象的两个数组的数组的第一个元素,我们知道还有两个int
个对象{1}}超出前两个的对象。)
c
与int **c
的定义意味着c
是指向int
指针的指针。指向指针的指针和指向数组的指针是不同的,并且不兼容。
解决此问题的一种方法是使用c
定义int (*c)[2] = malloc(2 * sizeof *c);
。然后,在分配更多空间的定义之后没有必要使用循环;单个分配分配整个数组。
应该类似地更改MultiArray
的返回类型,以及其中的代码和程序中的其他位置。或者,MultiArray
的第二个参数可以从int b[2][2]
更改为int **b
。 (后者是一个更容易编辑,但产生一个较差的程序,因为它使用了比必要更多的指针和分配。)
您应始终在启用警告的情况下编译代码。这会提醒你不正确的电话。