矩阵功率和指针

时间:2014-02-19 17:58:57

标签: c pointers matrix multidimensional-array

我试图使用乘法来计算矩阵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;

}

1 个答案:

答案 0 :(得分:0)

MultiArray被声明为采用int [2][2]类型的第二个参数,但是使用c参数调用它,其类型为int **。这些是不兼容的类型。

在参数中,类型int [2][2]会自动转换为指向两个int数组的指针,类型为int (*)[2]。这是一个指向有两个int个对象的地方的指针(因为我们知道它是两个int个对象的两个数组的数组的第一个元素,我们知道还有两个int个对象{1}}超出前两个的对象。)

cint **c的定义意味着c是指向int指针的指针。指向指针的指针和指向数组的指针是不同的,并且不兼容。

解决此问题的一种方法是使用c定义int (*c)[2] = malloc(2 * sizeof *c);。然后,在分配更多空间的定义之后没有必要使用循环;单个分配分配整个数组。

应该类似地更改MultiArray的返回类型,以及其中的代码和程序中的其他位置。或者,MultiArray的第二个参数可以从int b[2][2]更改为int **b。 (后者是一个更容易编辑,但产生一个较差的程序,因为它使用了比必要更多的指针和分配。)

您应始终在启用警告的情况下编译代码。这会提醒你不正确的电话。